剑指 Offer 03. 数组中重复的数字 - 力扣(LeetCode)
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
/对于查找某个数组[0-n-1]哪个数字没有出现,哪个数字重复了,有一种空间复杂度为O(1),时间复杂度O(n)的方法。
/就是在原数组的基础之上,对数组中每个位置出现数字所对应的数组中的位置进行+n的操作,这样只要后面遍历一遍这个数组,>2n的位置就是重复出现的,<n的位置就是没有出现的
//对于查找某个数组[0-n-1]哪个数字没有出现,哪个数字重复了,或者哪个数字没出现
//有一种空间复杂度为O(1),时间复杂度O(n)的方法
//就是在原数组的基础之上,对数组中每个位置出现数字所对应的数组中的位置进行+n的操作
//这样只要后面遍历一遍这个数组,>2n的位置就是重复出现的,<n的位置就是没有出现的
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int n=nums.size();
for(int i=0;i<n;++i)
{
nums[nums[i]%n]+=n;//对出现过的位置数值进行+法
//nums[i]%n这是为了避免某个位置的数值已经被增加操作过了
}
for(int i=0;i<n;++i){
if(nums[i]>2*n){//因为求的是重复出现了,所以看位置是否大于2n
return i;
}
}
return 0;
}
};