剑指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.数组中重复的数字的主要内容,如果未能解决你的问题,请参考以下文章

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

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

剑指Offer03. 数组中重复的数字(哈希)

剑指Offer03. 数组中重复的数字(哈希)

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

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