剑指 Offer 03. 数组中重复的数字:JavaScript 的两种哈希解法

题目链接

剑指 Offer 03: https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/

首先我们一起来看题目:

方法一

解题思路

拿到题目首先找关键点,发现这是一道找重复数字的题目,那么就应该联想到使用哈希表来进行处理。因为哈希表本身不允许出现重复元素,所以当添加元素失败或已经包含该数字时,则表示出现了重复元素,将其返回即可。

当然,如果你并没有联想到哈希表也没关系,因为刚开始写算法的时候,大部分人都无法将其联系起来,这是经验的积累。看完本文,你也成为了有经验的人 ????

JavaScript 中与哈希表相关的知识点有 Map 和 Set,基于此还可以扩展到 WeakMap 和 WeakSet,以及他们之间的相同点和不同点。一时答不上来的小伙伴,去复习一下相关知识点吧。

代码

/**
 * @param {number[]} nums
 * @return {number}
 */
var findRepeatNumber = function(nums) {
    const numSet = new Set();
    for(const num of nums) {
        if(numSet.has(num)){
            return num;
        }

        numSet.add(num);
    }
    return -1;
};

复杂度分析:

  • 时间复杂度:

  • 空间复杂度:

方法二

解题思路

  • 从题目描述中我们可以看出,因为所有数字都在 的范围内,其实完全可以省掉额外的空间开辟,将每个位置的数交换映射到其对应的数组下标下面,当出现新的元素与其对应的下标中的数字相等时,即为重复数字。

  • 这本质还是哈希的思想,思路 1 是使用库函数申请额外空间,思路 2 则是数组本身做哈希表,达到了节省空间的目的。

  • 此处会用到 while 循环,原因是保证交换过来的新元素位置也要正确。

代码

/**
 * @param {number[]} nums
 * @return {number}
 */
var findRepeatNumber = function(nums) {
    const len = nums.length;

    for(let i = 0; i < len; i++) {
        while(nums[i] !== i) {
            if(nums[i] === nums[nums[i]]) {
            return nums[i];
            }

            const temp = nums[i];
            nums[i] = nums[temp];
            nums[temp] = temp;
        }
    }
    
    return -1;
};

复杂度分析:

  • 时间复杂度:

  • 空间复杂度:


A leetcode a day, make me happy all day.

看完三件事

如果你觉得本文对你有帮助,我想请你帮个忙:

  1. 转发本文或者点个「在看」,让更多的人也能看到这篇内容;

  2. 关注公众号「技术漫谈」,订阅更多精彩内容,获取更多学习资料;

  3. 可以在本公众号后台回复「加群」,加入技术群,与更多读者交流。



长按上方二维码关注公众号「技术漫谈」,订阅更多精彩内容。

“在看”我吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值