数组中重复的值

前言

找出数组中重复的数字。

在一个长度为 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 的范围内。

posted @ 2020-09-21 08:29  敖毛毛  阅读(263)  评论(0编辑  收藏  举报