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

Posted !0 !

tags:

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

题目链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/

解题思路

方法一:HashSet

这和我们之前两数之和的做法差不多,直接遍历数组,如果在哈希表中不存在,就加入哈希表.存在就直接返回答案。由于哈希表查找效率为O(1),所以整体时间复杂度为O(n)

代码

class Solution {
    public int findRepeatNumber(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for(int i : nums) {
            if(set.contains(i)) 
                return i;
            set.add(i);
        }
        return -1;
    }
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

方法二:原地置换法

我们这里其实有一种更为巧妙的方法–原地置换法。这个方法可以把空间优化成O(1),下面我们来看一下思路。
由题我们可以发现n个数字都是在0~n-1的范围内,那么我们可以让一个下标对应一个数字,我们可以发现因为出现了重复数字,所以肯定会有至少一个位置上面会有几个数字,那么这个数字就是我们要找的重复数字。具体实现看代码。

代码

class Solution {
    public int findRepeatNumber(int[] nums) {
        for(int i = 0; i < nums.length; i++) {  //从下标0开始
            int t = i;          //代替i去置换
            while(nums[t] != t) {   //如果下标和数字不对应
                if(nums[t] == nums[nums[t]])    //把数字当作下标去找对应下标的数字,如果相等,就代表这个数十重复数字
                    return nums[t];
                int k = nums[nums[t]];  //如果不相等直接交换
                nums[nums[t]]= nums[t];
                nums[t] = k;
            }
        }
        return -1;
    }
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

以上是关于Leetcocde剑指 Offer 03. 数组中重复的数字(哈希表+原地置换法)的主要内容,如果未能解决你的问题,请参考以下文章

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

剑指offer03数组中重复的数字

剑指 Offer(C++版本)系列:剑指 Offer 03 数组中重复的数字

剑指 Offer(C++版本)系列:剑指 Offer 03 数组中重复的数字

剑指 Offer(C++版本)系列:剑指 Offer 03 数组中重复的数字

刷题记录leetcode 剑指 Offer(第 2 版)03-11