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

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

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


首先我们一起来看题目:


640.png

方法一


解题思路


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


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

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;
};


复杂度分析:


  • 时间复杂度:image.png
  • 空间复杂度:image.png
目录
相关文章
|
4月前
|
自然语言处理 前端开发 JavaScript
🛠️ JavaScript数组操作指南:20个精通必备技巧🚀
本文详细介绍了 JavaScript 中的 20 个高效数组操作技巧,涵盖了从基本的添加、移除元素,到数组转换和去重等高级操作。强调了不可变性的重要性,提供了清晰的代码示例,帮助开发者编写更整洁和高效的代码。无论是新手还是经验丰富的开发者,这些技巧都将显著提升您的编码能力,使您在项目中更具竞争力。
62 2
|
4月前
|
JavaScript 前端开发 测试技术
JS都有哪些操作数组的方法
JS都有哪些操作数组的方法
77 3
|
4月前
|
JavaScript
js删除数组中已知下标的元素
js删除数组中已知下标的元素
67 4
|
4月前
|
缓存 JavaScript 前端开发
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
71 1
|
4月前
|
JavaScript 前端开发 API
JS中数组的方法flat()怎么用
JS中数组的方法flat()怎么用
48 0
|
4月前
|
JavaScript 前端开发 索引
JavaScript中数组、对象等循环遍历的常用方法介绍(一)
JavaScript中数组、对象等循环遍历的常用方法介绍(一)
62 0
|
4月前
|
前端开发 JavaScript 索引
JavaScript 数组常用高阶函数总结,包括插入,删除,更新,反转,排序等,如map、splice等
JavaScript数组的常用高阶函数,包括遍历、插入、删除、更新、反转和排序等操作,如map、splice、push、pop、reverse等。
33 0
|
3月前
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
49 1
JavaScript中的原型 保姆级文章一文搞懂
|
7月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
138 2
|
3月前
JS+CSS3文章内容背景黑白切换源码
JS+CSS3文章内容背景黑白切换源码是一款基于JS+CSS3制作的简单网页文章文字内容背景颜色黑白切换效果。
33 0

热门文章

最新文章