尋找重複數
給定一個包含 n + 1 個整數的數組 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在一個重複的整數。假設只有一個重複的整數,找出這個重複的數。
說明:
不能更改原數組(假設數組是隻讀的)。
只能使用額外的 O(1) 的空間。
時間複雜度小於 O(n^2) 。
數組中只有一個重複的數字,但它可能不止重複出現一次。
思路:
法1:
我的思路是先排序,然後使用快慢指針,時間和空間複雜度都能夠滿足,但是改變了原數組。
public static int findDuplicate(int[] nums) {
Arrays.sort(nums);
int i=0,c=nums[0];
for (int j=1;j<nums.length;j++){
if (nums[i]!=nums[j])
i++;
else {
c=nums[i];
break;
}
}
return c;
}
法2:
在數組上迭代時存儲每個元素,這樣就可以在迭代時簡單地檢查每個元素。
爲了實現線性時間複雜性,可以在迭代數組時把每個元素插入set集合seen中,並在每次迭代時檢查集合seen中是否包含重複的那個數字。
public static int findDuplicate(int[] nums) {
Set<Integer> seen = new HashSet<Integer>();
for (int num : nums){
if (seen.contains(num)){
return num;
}
seen.add(num);
}
return -1;
}