剑指 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
目录
相关文章
|
1天前
|
JavaScript 前端开发 索引
JS遍历数组里数组下的对象,根据数组中对象的某些值,组合成新的数组对象
这篇文章介绍了如何在JavaScript中遍历数组里数组下的对象,并根据对象的某些属性值组合成一个新的数组对象。主要内容包括使用ES6的`for...of`循环来遍历数组对象,然后根据需要提取对象中的属性值,并将它们放入新的对象中,最终形成一个新的对象数组以供使用。
|
5天前
|
JavaScript 前端开发
JavaScript基础&实战(5)js中的数组、forEach遍历、Date对象、Math、String对象
这篇文章介绍了JavaScript中的数组、Date对象、Math对象以及包装类(String、Number、Boolean),并详细讲解了数组的创建、方法(如forEach、push、pop、unshift、slice、splice)和遍历操作,以及工厂方法创建对象和原型对象的概念。
JavaScript基础&实战(5)js中的数组、forEach遍历、Date对象、Math、String对象
|
5天前
|
JavaScript 前端开发 索引
JavaScript数组相关的方法有哪些?
JavaScript数组相关的方法有哪些?
|
5天前
|
JavaScript 前端开发
记录Javascript数组类练习
记录Javascript数组类练习
|
5天前
|
JavaScript 容器
JS-数组的定义
JS-数组的定义
|
6天前
|
JavaScript 前端开发
JavaScript——快速判断数组对象的值是否全部满足条件
JavaScript——快速判断数组对象的值是否全部满足条件
19 0
|
7天前
|
JavaScript 前端开发 索引
JavaScript数组的常用方法
JavaScript数组的常用方法
13 0
|
1月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
59 2
|
16天前
|
JavaScript 前端开发
JS:一篇文章带你搞懂什么是异步
JS:一篇文章带你搞懂什么是异步
|
1月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
54 4

热门文章

最新文章