https://leetcode.com/problems/find-the-duplicate-number/description/
题目:求出数组中出现多次的数字,数组大小为n+1,数组元素都是1-n之间的整数且只有一个数字重复出现。
思路:交换的方法。
比如 [2,1,1]
当前下标 对应元素 操作 数组
0 2 交换2和1 [1,2,1]
1 2 不需要操作 [1,2,1]
2 1 1和1相同,找到元素 [1,2,1]
通过交换的方式,将所有元素交换到正确的位置,即nums[x] 对应的数组下标为nums[x]-1。当某一次交换时,交换的两个元素相等,即找到重复数字,比如上面第三次操作时,1和1相等。
代码
class Solution {
public:
int findDuplicate(vector<int>& nums) {
for(int x=0;x<nums.size();x++){
while(nums[x]!=x+1){
int y = nums[x];
if(nums[x] == nums[nums[x]-1]) return nums[x];
nums[x] = nums[nums[x]-1];
nums[y-1] = y;
}
}
}
};