LeetCode-劍指offer-03-陣列中重複的數字
阿新 • • 發佈:2021-02-04
技術標籤:LeetCode劍指offer刷題記錄重複的數字消失的數字
目錄
原題連結
原題連結: 劍指 Offer 03. 陣列中重複的數字
找出陣列中重複的數字。
在一個長度為 n 的陣列 nums 裡的所有數字都在 0~n-1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意一個重複的數字。
輸入:
[2, 3, 1, 0, 2, 5, 3]
輸出:2 或 3
限制:2 <= n <= 100000
解題過程
問題轉化:消失的數字 -----> LeetCode-448-找到所有陣列中消失的數字
時間複雜度: O ( n ) O(n) O(n) | 空間複雜度: O ( 1 ) O(1) O(1)
class Solution {
public int findRepeatNumber(int[] nums) {
// 消失的數字
// 1. 元素整體加1,將這個問題完全轉換成“消失的數字”問題
for(int i = 0; i < nums.length; i++) ++nums[i];
// 2. 給陣列元素做標記
for(int i = 0; i < nums.length; i++){
int newIndex = Math.abs(nums[i]) - 1;
if(nums[newIndex] > 0){
nums[newIndex] *= -1;
}
}
// 3. 遍歷陣列,如果大於0,則返回(注意要將第一步加上的1減去)
for(int num : nums){
if(num > 0) return num - 1;
}
return -1;
}
}
利用Set的不重複特性 | 時間複雜度:
O
(
n
)
O(n)
O(n) | 空間複雜度:
O
(
n
)
O(n)
O(n)
class Solution {
public int findRepeatNumber(int[] nums) {
// 利用Set的元素不重複特性
Set<Integer> set = new HashSet<>();
for(int num : nums){
// 如果無法加入該元素,則說明集合中存在重複的元素,直接返回即可
if(!set.add(num)){
return num;
}
}
return -1;
}
}
先排序,後遍歷 | 時間複雜度: O ( n l o g n ) O(nlogn) O(nlogn) | 空間複雜度: O ( l o g n ) O(logn) O(logn)
class Solution {
public int findRepeatNumber(int[] nums) {
// 先排序
Arrays.sort(nums);
for(int i = 1; i < nums.length; i++){
// 返回重複值
if(nums[i] == nums[i - 1]) return nums[i];
}
return -1;
}
}