在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
方法一:计数的思路,出现重复就返回。空间O(N), 时间O(N)。
class Solution {
public int findRepeatNumber(int[] nums) {
var record = new HashSet<Integer>();
int ans = 0;
for(int i: nums)
{
// 出现重复返回
if(record.contains(i))
{
ans = i;
break;
}
record.add(i);
}
return ans;
}
}
方法2:题目的特殊性,数组值得范围是0~n-1,那么把每个值放到对应的位置上,直到遇见冲突的情况(该位置已经被正确放置值)就是重复值。时间O(N),空间O(1)。
class Solution {
public int findRepeatNumber(int[] nums) {
int ans = -1;
search:
for(int i=0; i<nums.length;i++)
{
//i位置的值不对应
while(i!=nums[i])
{ //将当前i位置的值放到nums[i]位置上,执行一次交换
if(nums[i] != nums[nums[i]])
{
//交换
int temp = nums[nums[i]];
nums[nums[i]] = nums[i];
nums[i] = temp;
}
else //发现nums[i]位置已经是nums[i]说明冲突出现
{
ans = nums[i];
break search;
}
}
}
return ans;
}
}