剑指 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 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
23 3
|
4天前
|
JavaScript
通过使用online表单的获取使用,了解vue.js数组的常用操作
通过使用online表单的获取使用,了解vue.js数组的常用操作
|
4天前
|
存储 JavaScript 前端开发
深入了解JavaScript中的indexOf()方法:实现数组元素的搜索和索引获取
深入了解JavaScript中的indexOf()方法:实现数组元素的搜索和索引获取
9 0
|
4天前
|
JavaScript 前端开发
js关于数组的方法
js关于数组的方法
11 0
|
4天前
|
JavaScript 前端开发
js怎么清空数组?
js怎么清空数组?
14 0
|
4天前
|
存储 JavaScript 前端开发
js处理数组的方法
js处理数组的方法
14 2
|
4天前
|
JavaScript 前端开发 索引
JavaScript 数组的索引方法数组转换为字符串方法
JavaScript 数组的索引方法数组转换为字符串方法
|
4天前
|
JavaScript 前端开发
JavaScript 数组的添加删除和排序
JavaScript 数组的添加删除和排序
|
4天前
|
JavaScript 前端开发
剑指 Offer 31. 栈的压入、弹出序列 (javascript实现)
剑指 Offer 31. 栈的压入、弹出序列 (javascript实现)
|
4天前
|
JavaScript 前端开发
js 操作数组的方法
js 操作数组的方法
23 4