原理:将数组元素nums[i]的值作为下标,即nums[nums[i] - 1]
适用:可以使用哈希表完成,但限制空间复杂度O(1),且数组元素和数组下标(0 ~ n-1或 1 ~ n)有关
287. 寻找重复数 - 力扣(LeetCode) (leetcode-cn.com)
思路:不断把nums[i]与nums[nums[i] - 1]进行比较,如果不等则把nums[i]放在nums[i]-1位置,如果相等则找到了。即,1放在0的位置,2放在1的位置... 目标:使得i位置放的是值为i+1的数,然后才继续循环
class Solution {
public:
int findDuplicate(vector<int>& nums) {
for(int i = 0; i < nums.size(); ) {
int tmpIdx = nums[i] - 1;
if(tmpIdx != i) {
if(nums[i] == nums[tmpIdx]) {
return nums[i];
} else {
swap(nums[i], nums[tmpIdx]);
}
} else {
i++;
}
}
return 0;
}
};