Skip to content
本页目录

03-数组中重复的数字

题目描述

https://leetcode.cn/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/

找出数组中重复的数字。

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 1:

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3 

限制:

2 <= n <= 100000

思路分析

  1. 常规解法,开辟一个字典Dict,保存已访问过的数字,如果存在,则说明有重复数组,否则就加入字典,循环到结束 时间复杂度 O(n),此方法需要额外开辟一个字典存储空间

  2. 数组下标对应解法
    注意到这里所有数字都在 0~n-1 的范围内,说明按照下标把数字都排列后,每个数字和下标应该是一一对应的,如果出现了不对应,说明有重复数字了 注意:这个方法会修改原数组

实现代码

  1. 常规解法
csharp
public class Solution {
    public int FindRepeatNumber(int[] nums) {
        Dictionary<int,int> dict = new Dictionary<int,int>();
        for(int i = 0; i < nums.Length; i++){
            if(dict.ContainsKey(nums[i])){
                return nums[i];
            }
            else{
                dict.Add(nums[i],nums[i]);
            }
        }
        return -1;
    }
}
  1. 数据下标对应法
csharp
public class Solution {
    public int FindRepeatNumber(int[] nums) {
        for(int i = 0; i < nums.Length ; i++){
            while(i != nums[i]){
                if(nums[i] == nums[nums[i]]){
                    return nums[i];
                }
                else{
                    //swap
                    int temp = nums[i];
                    nums[i] = nums[temp];
                    nums[temp] = temp;
                }
            }
        }
        return -1;
    }
}

复习:2022-05-02

csharp
public class Solution {
    public int FindRepeatNumber(int[] nums) {
        //把对应位置的数值换到下标那里去,如果遇到重复的数字,则会遇到相等的数字
        for(int i=0; i<nums.Length; i++){
            while(i != nums[i]){ //如果当前位置和小标不相等
                //如果当前位置和目标位置值相等,说明找到了
                if(nums[i] == nums[nums[i]]){
                    return nums[i];
                }
                //否则就把数字替换到他应该的地方去
                int temp = nums[i];
                nums[i] = nums[temp];
                nums[temp] = temp;
            }
        }
        return -1;
    }
}

Released under the MIT License.