找出陣列中重複的數字。
在一個長度為 n 的陣列 nums 裡的所有數字都在 0~n-1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意一個重複的數字。
示例 1:
輸入:
[2, 3, 1, 0, 2, 5, 3]
輸出:2 或 3
限制:
2 <= n <= 100000
方法一:我的做法
還可以最佳化,但是這畢竟是我提交的,所以直接複製貼上。哈哈。
程式碼
class Solution {
public int findRepeatNumber(int[] nums) {
int length = nums.length;
int[] index = new int[length];
for (int i=0; i<length; i++) {
index[i] = 0;
}
for (int i=0; i<length; i++) {
index[nums[i]]++;
}
for(int i=0; i<length; i++) {
if (index[i] > 1) {
return i;
}
}
return 0;
}
}
複雜度
時間複雜度:O(3N)
空間複雜度:O(N)
方法二:使用集合遍歷陣列
由於只需要找出陣列中任意一個重複的數字,因此遍歷陣列,遇到重複的數字即返回。為了判斷一個數字是否重複遇到,使用集合儲存已經遇到的數字,如果遇到的一個數字已經在集合中,則當前的數字是重複數字。
初始化集合為空集合,重複的數字 repeat = -1
遍歷陣列中的每個元素:
將該元素加入集合中,判斷是否新增成功
如果新增失敗,說明該元素已經在集合中,因此該元素是重複元素,將該元素的值賦給 repeat
,並結束遍歷
返回 repeat
程式碼
class Solution {
public int findRepeatNumber(int[] nums) {
Set<Integer> set = new HashSet<Integer>();
int repeat = -1;
for (int num : nums) {
if (!set.add(num)) {
repeat = num;
break;
}
}
return repeat;
}
}
複雜度
時間複雜度:O(n)。
遍歷陣列一遍。使用雜湊集合(HashSet),新增元素的時間複雜度為 O(1),故總的時間複雜度是 O(n)。
空間複雜度:O(n)。不重複的每個元素都可能存入集合,因此佔用 O(n) 額外空間。
個人理解
- 集合特性: 集合類中的
Set.add()
方法用來向Set
集合新增物件。如果Set
集合中已經包含相同的物件,則不改變Set
集合。該方法返回值為boolean
物件,如果Set
集合中不包含要新增的物件,則新增物件並返回true
,否則返回false
。
來源
作者:LeetCode-Solution
連結:leetcode-cn.com/problems/shu-zu-zh...
來源:力扣(LeetCode)
來源:力扣(LeetCode)
連結:leetcode-cn.com/problems/shu-zu-zh...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
本作品採用《CC 協議》,轉載必須註明作者和本文連結