数组中重复的值
前言
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
限制:
2 <= n <= 100000
正文
下面是我的几种解法:
我想到的就是字典:
public int FindRepeatNumber(int[] nums) {
Dictionary<int,int> dic=new Dictionary<int,int>();
foreach(var i in nums)
{
if(dic.ContainsKey(i))
{
return i;
}else
{
dic.Add(i,1);
}
}
return -1;
}
这种也是存在问题的,因为Dictionary 是key 和value形式,value纯属浪费。
然后是数组:
public int FindRepeatNumber(int[] nums) {
int[] x =new int[nums.Length];
foreach(var i in nums)
{
x[i]++;
if(x[i]>1)
{
return i;
}
}
return -1;
}
但是一下子产生了数组,可能在一些情况下数组很多都浪费了。
那么想到了集合
public class Solution {
public int FindRepeatNumber(int[] nums) {
HashSet<int> set = new HashSet<int>();
foreach (var i in nums)
{
if (!set.Add(i))
{
return i;
}
}
return -1;
}
}
最后我看了别人的。
public class Solution {
public int FindRepeatNumber(int[] nums) {
int temp;
for(int i=0;i<nums.Length;i++){
while (nums[i]!=i){
if(nums[i]==nums[nums[i]]){
return nums[i];
}
temp=nums[i];
nums[i]=nums[temp];
nums[temp]=temp;
}
}
return -1;
}
}
这种思路还是第一次见,然后主要在于审题,在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。
很巧妙,每次让数字回到一个位置上,那么下一个比较的就是和对应位置的数字做比较。可以画一个图。
画的有点凌乱,但是大概就是这个意思,当时我考虑的是是否会出现无限循环,后来证实了不可能。
因为这样的,假如要形成无限循环的话,那么nums[i]!=i就有不存在。
那么除非是没有这个数,否则一定会形成交叉。
那么就在没有这个数的情况下,只要有相等的那么就会跳出循环。
那么就在没有这个数也没有相等的情况下。
但是这种情况不可能,因为:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。