題目鏈接:https://leetcode-cn.com/problems/find-the-duplicate-number
給定一個包含 n + 1 個整數的數組 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在一個重複的整數。假設只有一個重複的整數,找出這個重複的數。
輸入: [1,3,4,2,2]
輸出: 2
輸入: [3,1,3,4,2]
輸出: 3
兩種解題方法:
- 根據前面做題經驗知道,兩個相同的數異或的結果是0…所以可以遍歷兩次數組,如果出現異或爲0,就返回該數。時間複雜度O(n^2),顯然不是題目想考的。
重點介紹第二種解題方法:
仔細讀題發現,數組的長度比數字範圍大1,而數值範圍在1到n之間,且至少存在一個重複的整數。這意味着:可以把數組中的數字按照索引存儲起來,如果遇到重複的數字,就判斷該索引處是否已經有值,有的話就是重複數字
class Solution {
public int findDuplicate(int[] nums) {
int len = nums.length;
int i = 0;
while(i < len){
if (nums[i] == i){
i++;
continue;
}
if (nums[nums[i]] == nums[i]) return nums[i];
int tmp = nums[i];
nums[i] = nums[tmp];
nums[tmp] = tmp;
}
return 0;
}
}