• 数组中重复的值


    前言

    找出数组中重复的数字。

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

  • 相关阅读:
    Centos搭建PHP5.3.8+Nginx1.0.9+Mysql5.5.17
    初识Mongodb总结
    初识Mongodb之[CURD]PHP版
    Centos搭建Samba
    PHP图像处理(二) GraphicsMagick 安装扩展及使用方法
    Vcastr3.0开源在线flv播放器
    自动更新@version svn版本号信息
    Centos安装Memcache
    MVC演化
    JAVA与.NET的相互调用——TCP/IP相互调用基本架构
  • 原文地址:https://www.cnblogs.com/aoximin/p/13703611.html
Copyright © 2020-2023  润新知