题目传送门:https://leetcode.cn/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/
这里给出一个时间复杂度O(n),空间复杂度O(1)的算法
主要的思想是把每个数交换到与该数相等的索引的位置,即nums[i]==i,第一次遇到这个数就把它交换到与该数相等的数组下标位置,第二次遇到这个数x时有nums[x]==x,此时一定可以得到一个重复数字
假设遍历到了nums[i]这个数,如果这个数
与数组下标相等,即nums[i]==i,则跳过下列判断并继续枚举
如果该数与数组下标不等,但是相等的数组下标位置所存的数已经满足nums[i]==i,此时这个数就是一个重复的数,直接return nums[i]
否则就把这个数交换到与该数相等的数组下标的位置
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int i=0;
while(i<nums.size())
{
if(nums[i]==i)
{
i++;
continue;
}
int k=nums[i];
if(k==nums[k])
{
return k;
}
int tmp=nums[i];
nums[i]=nums[tmp];
nums[tmp]=tmp;
}
return -1;
}
};