哈哈哈,前端再战 LeetCode 算法之两数之和 twoSum,两种解法精讲,含 ES6 Map 知识点复习

从本次文章开始,我就开启前端 LeetCode 算法的刷题系列更新了,主要更新一些前端面试高频的算法题目,会包含解题思路和 JavaScript 代码,文章末尾会讲解算法用到的知识点回顾,如果看完本文觉得还不错的话,可以点波关注不迷路。

🎉题目描述

LeetCode 地址

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9

输出:[0,1]

解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6

输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6

输出:[0,1]

::: tip 提示

2 <= nums.length <= 104

-109 <= nums[i] <= 109

-109 <= target <= 109

只会存在一个有效答案

你可以想出一个时间复杂度小于 O(n2) 的算法吗?

解题思路

简而言之就是在一个数组中找到两个数,使得它们的和等于目标值,记录并返回这两个数的下标。接下来我们讲两种解法。

👌暴力解法

两层 for 循环:

外层循环 i 从 0 开始,内层循环 j 从 i+1 开始。

  • 初始外层 for 循环 i=0,然后内层 for 循环遍历数组中第 1 到 nums.length - 1 的所有的数字,如果找到和等于 targetnums[i]nums[j],返回 [i, j]

  • 如果没有找到,外层 for 循环 i++,继续下一轮内层 for 循环遍历。

  • 直到找到这两个数,返回此时的 [i, j]

代码:

/*** @param {number[]} nums* @param {number} target* @return {number[]}*/
const twoSum = function (nums, target) {for (let i = 0; i < nums.length; i++) {for (let j = i + 1; j < nums.length; j++) {if (nums[i] + nums[j] === target) {return [i, j];}}}
};

使用两层 for 循环,时间复杂度: O(n2)

💯哈希表

前置知识:ES6 的 Map, 文档地址:MDN Map,文档后面讲讲 Map 的基础用法

基础使用

解题步骤:

  • 先初 new 一个空的哈希表 map
  • for 循环从 i = 0 到 nums.length - 1 遍历数组,如果 map 有键target-nums[i])(或者访问键target-nums[i])对应的值不是undefined ),就 return [i, map.get(target-nums[i])]
  • 否者,就把nums[i]作为键,i 作为值,存储到 map 中。

注意
这里往 map 中存储的键值对一定是存储nums[i]作为键,i 作为值,而不是 i 作为键,nums[i])作为值。

因为 Map 的键是作为键值对访问的唯一标识,只能通过键来判断键值对是否存在,不能通过值来判断键值对是否存在,若要判断 target-nums[i]是否和nums[x]相等,只能把nums[i]当作键。

代码:

/*** @param {number[]} nums* @param {number} target* @return {number[]}*/
const twoSum = function (nums, target) {const map = new Map();for (let i = 0; i < nums.length; i++) {// 另一种if语句写法// if(map.get(target - nums[i]) !== undefined)if (map.has(target - nums[i])) {return [i, map.get(target - nums[i])];} else {map.set(nums[i], i);}}
};

时间复杂度分析:
一层 for 循环,时间复杂度 O(n),Map 的访问速度是常数级接近 O(1),所以总的时间复杂度是 O(n)。

ES6 的 Map

Map 是 ES6 新增的数据结构,用来存储键值对,键是唯一的,可以快速判断键是否存在。任何值(对象或者原始值)都可以作为键或值。

构造函数

  • Map() 构造函数创建 Map 对象。

实例方法

  • Map 实例的 set() 方法会向 Map 对象添加或更新一个指定的键值对。

  • Map 实例的 delete() 方法从该 map 中删除指定键的元素。

  • Map 实例的 get() 方法返回该 map 中的指定元素。如果与所提供的键相关联的值是一个对象,那么你将获得该对象的引用,对该对象所做的任何更改都会有效地在 Map 对象中修改它。

  • Map 实例的 has() 方法返回一个布尔值,指示具有指定键的元素是否存在。

  • Map 实例的 clear() 方法会移除该 map 中的所有元素。

  • Map 实例的 keys() 方法返回一个新的 map 迭代器对象,该对象包含了此 map 中每个元素的键,按插入顺序排列。

  • Map 实例的 values() 方法返回一个新的 map 迭代器对象,该对象包含此 map 中每个元素的值,按插入顺序排列。

  • Map 实例的 entries() 方法返回一个新的 map 迭代器对象,该对象包含了此 map 中的每个元素的 [key, value] 对,按插入顺序排列。

  • Map 实例的 forEach() 方法按插入顺序对该 map 中的每个键/值对执行一次提供的函数。

实例属性

  • Map 实例的 size 访问器属性返回此 map 中元素的数量。

代码示例

基础示例用法(更多示例用法见MDN Map ):

// Map() 构造函数创建 Map 对象。
const map = new Map();
const myMap = new Map([[1, "one"],[2, "two"],[3, "three"]
]);
// 增
map.set("name", "张三");
map.set("age", 18);
// 删
map.delete("name"); //true
// 查
map.has("age"); //true
map.get("age"); //18
// 改
map.set("age", 19); //true
map.get("age"); //19map.size; //1map.clear(); //清空map
map.size; //0

总结

本文探讨了 LeetCode 中的"两数之和"问题的两种解法:一是暴力解法,使用双层循环,时间复杂度 O(n^2);二是更高效的哈希表解法,利用 ES6 Map 存储遍历过程,以 O(n)时间复杂度完成。文章最后详细回顾了 Map 的使用,包括创建、插入、删除、查询操作及属性,通过示例代码加深理解。

如果觉得还不错的话,可以点个赞哟,如果你也在刷算法的话,也可以点波关注,更多 LeetCode 算法持续更新中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1474209.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【手写数据库内核组件】01 解析树的结构,不同类型的数据结构组多层的链表树,抽象类型统一引用格式

不同类型的链表 ​专栏内容&#xff1a; postgresql使用入门基础手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 文章目录 不同类型…

将大型语言模型模块化打造协作智能体

B UILDING C OOPERATIVE E MBODIED A GENTS MODULARLY WITH L ARGE L ANGUAGE M ODELS 论文链接&#xff1a; https://arxiv.org/abs/2307.02485https://arxiv.org/abs/2307.02485 1.概述 在去中心化控制及多任务环境中&#xff0c;多智能体合作问题因原始感官观察、高昂…

1、spring5.2.x源码解读之下载源码和编译

1、下载源码 1.1、git下载源码 git地址&#xff1a;https://gitcode.net/mirrors/spring-projects/spring-framework.git 1.2、源码导入idea 源码下载地址&#xff1a;https://gitcode.net/mirrors/spring-projects/spring-framework/-/archive/5.2.x/spring-framework-5.2…

LeetCode题练习与总结:直线上最多的点数--149

一、题目描述 给你一个数组 points &#xff0c;其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 示例 1&#xff1a; 输入&#xff1a;points [[1,1],[2,2],[3,3]] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;points [[1,…

Golang | Leetcode Golang题解之第220题存在重复元素III

题目&#xff1a; 题解&#xff1a; func getID(x, w int) int {if x > 0 {return x / w}return (x1)/w - 1 }func containsNearbyAlmostDuplicate(nums []int, k, t int) bool {mp : map[int]int{}for i, x : range nums {id : getID(x, t1)if _, has : mp[id]; has {retu…

安卓备忘录App开发

安卓备忘录APP开发,文章末尾有源码和apk安装包 目标用户: 普通安卓手机用户,需要一个简单易用的备忘录App来记录和管理日常事务。 主要功能: 用户注册: 用户可以创建一个账号,输入用户名和密码。 用户登录: 用户可以通过用户名和密码登录到应用。 用户信息存储: 用户名和…

算法010:无重复字符的最长子串

无重复字符的最长子串. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/longest-substring-without-repeating-characters/ 使用的算法&#xff1a;滑动窗口 在这个…

Qt/C++音视频开发78-获取本地摄像头支持的分辨率/帧率/格式等信息/mjpeg/yuyv/h264

一、前言 上一篇文章讲到用ffmpeg命令方式执行打印到日志输出&#xff0c;可以拿到本地摄像头设备信息&#xff0c;顺藤摸瓜&#xff0c;发现可以通过执行 ffmpeg -f dshow -list_options true -i video“Webcam” 命令获取指定摄像头设备的分辨率帧率格式等信息&#xff0c;会…

飞书 API 2-4:如何使用 API 将数据写入数据表

一、引入 上一篇创建好数据表之后&#xff0c;接下来就是写入数据和对数据的处理。 本文主要探讨数据的插入、更新和删除操作。所有的操作都是基于上一篇&#xff08;飞书 API 2-4&#xff09;创建的数据表进行操作。上面最终的数据表只有 2 个字段&#xff1a;序号和邮箱。序…

FairJob:促进在线广告系统公平性研究

在人工智能&#xff08;AI&#xff09;与人类动态的交汇处&#xff0c;既存在机遇也存在挑战&#xff0c;特别是在人工智能领域。尽管取得了进步&#xff0c;但根植于历史不平等中的持续偏见仍然渗透在我们的数据驱动系统中&#xff0c;这些偏见不仅延续了不公平现象&#xff0…

生成式AI的短板在于“Token”的存在

生成式AI模型处理文本的方式与人类不同。理解它们基于“token”的内部环境&#xff0c;可能有助于解释一些奇怪行为和固有局限性。 从小型设备上的Gemma到OpenAI领先行业的GPT-4o&#xff0c;大多数模型都是基于一种称为Transformer的架构。由于Transformer在将文本与其他类型…

git把本地分支的提交到自己的远程分支,然后合并特定远程分支

1、首先&#xff0c;把本地更改的代码放到暂存区&#xff1a;git add . 2、把暂存区的代码进行提交&#xff1a;可以直接在控制台提交也可以使用代码git commit -m "进行的操作的注释" 提交前&#xff1a; 提交后&#xff1a; 3、使用git pull拉取代码&#xff08;这…

(南京观海微电子)——MOS管原理及应用区别

MOS管&#xff1a; 全称为金属氧化物半导体场效应管&#xff08;Metal Oxide Semiconductor Field Effect Transistor&#xff09;&#xff0c;也被称为MOSFET&#xff08;Metal-Oxide-Semiconductor Field-Effect Transistor&#xff09;。它是一种半导体器件&#xff0c;常用…

图论·Day01

P3371 P4779 P3371 【模板】单源最短路径&#xff08;弱化版&#xff09; 注意的点&#xff1a; 边有重复&#xff0c;选择最小边&#xff01;对于SPFA算法容易出现重大BUG&#xff0c;没有负权值的边时不要使用&#xff01;&#xff01;&#xff01; 70分代码 朴素板dijsk…

【pytorch20】多分类问题

网络结构以及示例 该网络的输出不是一层或两层的&#xff0c;而是一个十层的代表有十分类 新建三个线性层&#xff0c;每个线性层都有w和b的tensor 首先输入维度是784&#xff0c;第一个维度是ch_out,第二个维度才是ch_in(由于后面要转置)&#xff0c;没有经过softmax函数和…

Fast R-CNN(论文阅读)

论文名&#xff1a;Fast R-CNN 论文作者&#xff1a;Ross Girshick 期刊/会议名&#xff1a;ICCV 2015 发表时间&#xff1a;2015-9 ​论文地址&#xff1a;https://arxiv.org/pdf/1504.08083 源码&#xff1a;https://github.com/rbgirshick/fast-rcnn 摘要 这篇论文提出了一…

基于java+springboot+vue实现的校园外卖服务系统(文末源码+Lw)292

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;外卖信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

Stream流真的很好,但答应我别用toMap()

你可能会想&#xff0c;toList 和 toSet 都这么便捷顺手了&#xff0c;当又怎么能少得了 toMap() 呢。 答应我&#xff0c;一定打消你的这个想法&#xff0c;否则这将成为你噩梦的开端。 让我们先准备一个用户实体类。 Data AllArgsConstructor public class User { priv…

昇思MindSpore学习总结十——ResNet50迁移学习

1、迁移学习 &#xff08;抄自CS231n Convolutional Neural Networks for Visual Recognition&#xff09; 在实践中&#xff0c;很少有人从头开始训练整个卷积网络&#xff08;使用随机初始化&#xff09;&#xff0c;因为拥有足够大小的数据集相对罕见。相反&#xff0c;通常…

LLM - 循环神经网络(RNN)

1. RNN的关键点&#xff1a;即在处理序列数据时会有顺序的记忆。比如&#xff0c;RNN在处理一个字符串时&#xff0c;在对字母表顺序有记忆的前提下&#xff0c;处理这个字符串会更容易。就像人一样&#xff0c;读取下面第一个字符串会更容易&#xff0c;因为人对字母出现的顺序…