剑指offer 03.数组中重复的数字

Posted 红颜莫知己

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer 03.数组中重复的数字相关的知识,希望对你有一定的参考价值。

目录

找出数组中重复的数字。

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

示例 1:

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

思路分析

方法一:Set

看到重复两个字我们一定要想起HashSet这个数据结构,它是基于HashMap实现的,是一个不允许出现重复元素集合

  • 这道题中,我们可以用HashSet来存储遍历出来的值,若遇到重复值,赋予结果,break退出

java代码:

class Solution 
    public int findRepeatNumber(int[] nums) 
       Set set = new HashSet<Integer>();
       int result = 0;

       for (int num : nums) 
           if(!set.add(num))
               result = num;
               break;
           
       
       return result;
    

复杂度分析

时间复杂度

O(n),遍历数组使用O(n)

空间复杂度

O(n),HashSet占的空间为n

方法二 :原地交换

如果是一道面试题,那么方法一就完全不够,谁都会,而且时间空间复杂度不行,我们需要改进

我们不定义额外的空间,就在传进来的数组中进行检查,由于数组长度为n,数值范围却是0~n-1那说明数组中索引和值是一对多的

既然这样,我们将数组对应索引,对应值一一归为,当有一个值与其对应索引值相等,那说明该数字为重复数组,即

  • nums[i] = nums[nums[i]]

若不符合条件,交换位置,直到数值回到对应索引

nums[i] != i


nums[i] != i

nums[i] != i

交换位置后,索引0~3都已经归为,所以不与其他索引进行交换,直到索引4,nums[i] != i;

java代码

class Solution 
    public int findRepeatNumber(int[] nums)        
        for (int i = 0 ; i < nums.length ;i++) 
            while (nums[i] != i) 
                if (nums[i] == nums[nums[i]]) 
                    return nums[i];           
          
                int temp = nums[i];
                nums[i] = nums[temp];
                nums[temp] = temp;
            
        
        return -1;
    

复杂度分析

时间复杂度

O(n),遍历数组使用时间O(n)

空间复杂度

O(1),使用常数级别的额外空间

若有误,请指教!!!

以上是关于剑指offer 03.数组中重复的数字的主要内容,如果未能解决你的问题,请参考以下文章

Leetcocde剑指 Offer 03. 数组中重复的数字(哈希表+原地置换法)

剑指offer-03~05

剑指Offer 03. 数组中重复的数字

剑指Offer 03. 数组中重复的数字

剑指 Offer 03. 数组中重复的数字

剑指 Offer 03. 数组中重复的数字 的 详细题解