zoukankan      html  css  js  c++  java
  • 数组中重复的值

    前言

    找出数组中重复的数字。

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

  • 相关阅读:
    容器适配器————priority_queue
    容器适配器————queue
    容器适配器之总结
    序列式容器之总结
    序列式容器————forward_list
    序列式容器————list
    序列式容器————dequeue
    13.软件项目管理与敏捷方法——如何变更职责笔记
    10.软件项目管理与敏捷方法——沟通管理笔记
    09.软件项目管理与敏捷方法——人力资源管理笔记
  • 原文地址:https://www.cnblogs.com/aoximin/p/13703611.html
Copyright © 2011-2022 走看看