08、JS实现:数组两数之和算法的两种解决方案(一步一步剖析,很详细)

数组两数之和的算法

  • Ⅰ、数组两数之和算法的方案一:
    • 1、题目描述:
    • 2、解题思路:
    • 3、实现代码:
  • Ⅱ、数组两数之和算法的方案二:
    • 1、实现代码:
  • Ⅲ、小结:

Ⅰ、数组两数之和算法的方案一:

1、题目描述:

给定⼀个整数数组 nums 和⼀个⽬标值 target,请你在该数组中找出和为⽬标值的那 两个 整数,并返回他们的数组下标;
你可以假设每种输⼊只会对应⼀个答案;但是,数组中同⼀个元素不能使⽤两遍;
示例1:
给定 nums = [2, 7, 11, 15], target = 9;
因为 nums[0] + nums[1] = 2 + 7 = 9;
所以返回 [0, 1]
示例2:
给定 nums = [2, 3, 5, 6, 11, 15], target = 8;
因为 nums[1] + nums[2] = 3 + 5 = 8;
所以返回[ 1, 2 ]

2、解题思路:

方案一:
对于这道题,我们很容易想到使⽤两层循环来解决这个问题,但是两层循环的复杂度为O(n2),但也能解决该问题,当然,我们也可以考虑能否换⼀种思路,减⼩复杂度。

方案二:
这⾥使⽤⼀个 map 对象来储存遍历过的数字以及对应的索引值;
我们在这⾥使⽤减法进⾏计算:
● 计算 target 和第⼀个数字的差,并记录进 map 对象中,其中两数差值作为 key,其索引值作为 value。
● 再计算第⼆个数字与 target 的差值,并与 map 对象中的数值进⾏对⽐,若相同,直接返回,若没有相同值,就将这个差值也存⼊ map 对象中。
● 重复第⼆步,直到找到⽬标值。

3、实现代码:

其一、代码为:


// 双层循环的代码执行过程:
const twoSum = (nums, target) => {let len = nums.lengthfor (let i = 0; i < len; i++) {for (let j = 0; j < len; j++) {if (nums[i] + nums[j] == target && i != j) {return [i, j]}}}
}// 此时的输出结果为:[ 1, 8 ];
twoSum([1, 2, 3, 4, 11, 15, 22, 78, 7], 9)
执行  twoSum([1, 2, 3, 4, 11, 15, 22, 78, 7], 9)  函数后代码执行的过程:第一个循环:for (let i = 0; i < len; i++) {}, len = 9, i=0 的情况:第二个循环:for (let j = 0; j < len; j++) {}, len = 9, target = 9;i       j      num[i]      num[j]        nums[i] + nums[j] == target && i != j0       0      num[0]=1    num[0]=1                       false0       1      num[0]=1    num[1]=2                       false0       2      num[0]=1    num[2]=3                       false0       3      num[0]=1    num[3]=4                       false0       4      num[0]=1    num[4]=11                      false0       5      num[0]=1    num[5]=15                      false0       6      num[0]=1    num[6]=22                      false0       7      num[0]=1    num[7]=78                      false0       8      num[0]=1    num[8]=7                       false第一个循环:for (let i = 0; i < len; i++) {}, len = 9, i=1 的情况:第二个循环:for (let j = 0; j < len; j++) {}, len = 9, target = 9;i       j      num[i]      num[j]        nums[i] + nums[j] == target && i != j1       0      num[1]=2    num[0]=1                       false1       1      num[1]=2    num[1]=2                       false1       2      num[1]=2    num[2]=3                       false1       3      num[1]=2    num[3]=4                       false1       4      num[1]=2    num[4]=11                      false1       5      num[1]=2    num[5]=15                      false1       6      num[1]=2    num[6]=22                      false1       7      num[1]=2    num[7]=78                      false1       8      num[1]=2    num[8]=7                       true执行 return [i, j] 语句后,页面的返回值为:[1,8]

其二、截图为:

在这里插入图片描述

Ⅱ、数组两数之和算法的方案二:

1、实现代码:

其一、代码为:


// 通过 map 对象来储存遍历过的数字以及对应的索引值,通过减法来计算:
const twoSum = (nums, target) => {// let array = []const maps = {}const len = nums.lengthfor (let i = 0; i < len; i++) {// console.log(maps[target - nums[i]], 11223344)if (maps[target - nums[i]] !== undefined) {return [maps[target - nums[i]], i]// array.push([maps[target - nums[i]], i])}maps[nums[i]] = i// console.log(maps, 5566778899)}// return array
}// 此时的输出结果为:[ 1, 8 ];
twoSum([1, 2, 3, 4, 11, 15, 22, 78, 7], 9)
执行  twoSum([1, 2, 3, 4, 11, 15, 22, 78, 7], 9)  函数后代码执行的过程:第一个循环:for (let i = 0; i < len; i++) {}, len = 9, target = 9 的情况:i          maps[target - nums[i]]           maps[nums[i]] = i           maps0          maps[8]=undefined                maps[1]=0                   {1:0}1          maps[7]=undefined                maps[2]=1                   {1:0,2:1}2          maps[6]=undefined                maps[3]=2                   {1:0,2:1,3:2}3          maps[5]=undefined                maps[4]=3                   {1:0,2:1,3:2,4:3}4          maps[-2]=undefined               maps[11]=4                  {1:0,2:1,3:2,4:3,11:4}5          maps[-6]=undefined               maps[15]=5                  {1:0,2:1,3:2,4:3,11:4,15:5}6          maps[-13]=undefined              maps[22]=6                  {1:0,2:1,3:2,4:3,11:4,15:5,22:6}7          maps[-69]=undefined              maps[78]=7                  {1:0,2:1,3:2,4:3,11:4,15:5,22:6,78:7}8          maps[2]!==undefined             执行 return [maps[target - nums[i]], i] 语句(即:return [map[2],8])后,页面的返回值为:[1,8]注意:maps[2] 并不代表着 maps 是一个数组,而是 maps 对象取属性值的另一种语法(即:同 maps.2 的用法,但数字一般不支持而是支持maps[2] 这样的语法);当然,也可以修改该代码,如上述代码,放开注释就可以得到符合 target 值的二维数组,如:[ [ 1, 8 ] ];

其二、截图为:

在这里插入图片描述

Ⅲ、小结:

其一、哪里有不对或不合适的地方,还请大佬们多多指点和交流!
其二、若有转发或引用本文章内容,请注明本博客地址(直接点击下面 url 跳转) https://blog.csdn.net/weixin_43405300,创作不易,且行且珍惜!
其三、有兴趣的话,可以多多关注这个专栏(Vue(Vue2+Vue3)面试必备专栏)(直接点击下面 url 跳转):https://blog.csdn.net/weixin_43405300/category_11525646.html?spm=1001.2014.3001.5482

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BIONIOAIO

通信技术整体解决的问题 1.局域网内的通信要求 2.多系统间的底层消息传递机制 3.高并发下&#xff0c;大数据量的通信场景需要 4.游戏行业。无论是手游服务端、还是大型网络游戏&#xff0c;java的应用越来越广 IO模型基本说明 就是用什么样的通道或者说是通信模式和架构…

数据结构——二叉树——堆

前言&#xff1a; 在前面我们已经学习了数据结构的基础操作&#xff1a;顺序表和链表及其相关内容&#xff0c;今天我们来学一点有些难度的知识——数据结构中的二叉树&#xff0c;今天我们先来学习二叉树中堆的知识&#xff0c;这部分内容还是非常有意思的&#xff0c;下面我们…

前端xss攻击——规避innerHtml过滤标签节点及属性

文章目录 ⭐前言⭐规避innerHtml&#x1f496;在iframe中使用innerHtml的场景&#x1f496;标签转义&#x1f496;url 进行encode&#x1f496;手动过滤内容转义 ⭐inscode代码块演示⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享xss攻击——规避innerHtml过…

list(链表)容器(一)

一、list基本概念 链表&#xff08;list&#xff09;是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成&#xff1a;链表由一系列结点组成 结点的组成&#xff1a;一个是存储数据元素的数据域&#xff0…

通过pymysql读取数据库中表格并保存到excel(实用篇)

本篇文章是通过pymysql将本地数据库中的指定表格保存到excel的操作。 这里我们假设本地已经安装了对应的数据库管理工具&#xff0c;里面有一个指定的表格&#xff0c;现在通过python程序&#xff0c;通过调用pymysql进行读取并保存到excel中。 关于数据库管理工具是Navicat P…

【题解】—— LeetCode一周小结13

【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结12 25.零钱兑换 II 题目链接&#xff1a;518. 零钱兑换 II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合…

NVIDIA Jetson Xavier NX入门-镜像为jetpack5(3)——pytorch和torchvision安装

NVIDIA Jetson Xavier NX入门-镜像为jetpack5&#xff08;3&#xff09;——pytorch和torchvision安装 镜像为jetpack5系列&#xff1a; NVIDIA Jetson Xavier NX入门-镜像为jetpack5&#xff08;1&#xff09;——镜像烧写 NVIDIA Jetson Xavier NX入门-镜像为jetpack5&#…

PI案例分享--2000A核心电源网络的设计、仿真与验证

目录 摘要 0 引言 1 为什么需要 2000A 的数字电子产品? 2 2000A 的供电电源设计 2.1 "MPM3698 2*MPM3699"的 MPS扩展电源架构 2.2 使用恒定导通时间(COT)模式输出核心电压的原因 2.3 模块化 VRM 的优势 2.4 用步进负载验证2000A的设计难点 2.4.1 电源网络 …

机器人---人形机器人之技术方向

1 背景介绍 在前面的文章《行业杂谈---人形机器人的未来》中&#xff0c;笔者初步介绍了人形机器人的未来发展趋势。同智能汽车一样&#xff0c;它也会是未来机器人领域的一个重要分支。目前地球上最高智慧的结晶体就是人类&#xff0c;那么人形机器人的未来会有非常大的发展空…

【深度学习】球衣号码识别 re-id追踪

1. CLIP-ReIdent: Contrastive Training for Player Re-Identification 论文解析–2023的论文&#xff0c;貌似顶会 论文方法是类不可知的&#xff0c;微调CLIP vitl/14模型&#xff0c;在MMSports 2022球员重新识别挑战中实现98.44%的mAP。此外&#xff0c;CLIP Vision Trans…

在 C#和ASP.NET Core中创建 gRPC 客户端和服务器

关于gRPC和Google protobuf gRPC 是一种可以跨语言运行的现代高性能远程过程调用 (RPC) 框架。gRPC 实际上已经成为 RPC 框架的行业标准&#xff0c;Google 内外的组织都在使用它来从微服务到计算的“最后一英里”&#xff08;移动、网络和物联网&#xff09;的强大用例。 gRP…

SQLite3进行数据库各项常用操作

目录 前言1、SQLite介绍2、通过SQLite创建一个数据库文件3、往数据库文件中插入数据4、数据库文件信息查询5、修改数据库中的内容6、删除数据库中的内容 前言 本文是通过轻量化数据库管理工具SQLite进行的基础操作和一些功能实现。 1、SQLite介绍 SQLite是一个广泛使用的嵌入…

微信小程序如何进行npm导入组件

文章目录 目录 文章目录 前言 一、安装node 二、微信小程序通过npm安装组件&#xff08;以Vant-weapp为例&#xff09; 一、Vant-weapp下载 二 、修改 app.json 三 、修改 project.config.json 四 、 构建 npm 包 前言 微信小程序使用npm导入有很多的教程&#xff0c;我…

vue基础教程(5)——十分钟吃透vue路由router

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、路由概念二、路由使用三、创建路由对应的组件四、给整个项目一个入口总结 前言 前面的文章运行成功后&#xff0c;页面显示如下&#xff1a; 在这个页面中&#xff0c;点击Home和About都会切换右面的页面内容&#…

一百以内累加(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS #include <stdio.h>int main() {//初始化变量值&#xff1b;int a 2;int result 1;//循环运算&#xff1b;while (a < 100){//加&#xff1b;result a result;//改变变量值&a…

Spring(详细介绍)

目录 一、简介 1、什么是Spring&#xff1f; 2、Spring框架的核心特性 3、优点 二、IOC容器 介绍 1、获取资源的传统方式 2、控制反转方式获取资源 3、DI 4、IOC容器在Spring中的实现 入门案例 1、创建Maven Module 2、引入依赖 3、创建HelloWorld类 4、在Spring的配…

【动手学深度学习】深入浅出深度学习之利用神经网络识别螺旋状数据集

目录 &#x1f31e;一、实验目的 &#x1f31e;二、实验准备 &#x1f31e;三、实验内容 &#x1f33c;1. 生成螺旋状数据集 &#x1f33c;2. 打印数据集 &#x1f33c;3. 编程实现 &#x1f33b;仿射层-Affine类 &#x1f33b;传播层-Sigmoid类 &#x1f33b;损失函数…

Unity urp渲染管线下,动态修改材质球surfaceType

在项目中遇到了需要代码动态修改材质球的surfaceType&#xff0c;使其动态切换是否透明的需求。 urp渲染管线下&#xff0c;动态修改材质球的surfaceType&#xff0c;查了大部分帖子&#xff0c;都有一些瑕疵&#xff0c;可能会造成透明后阴影投射有问题。 其次在webgl平台上…

简单了解波 Mono-repo Multi-repo(Poly-repo)

Mono-repo 和 Multi-repo 是软件开发中代码管理的两个不同策略。Mono-repo & Multi-repo 孰优孰劣是个老生常谈得话题了&#xff0c;这里就不 PK 了&#xff0c;“略微”看下两者区别。 当我们使用 Git 作为版本控制系统管理项目的代码时&#xff0c;那么 monorepo 与 mul…

iptables 与 firewalld 防火墙

iptables iptables 是一款基于命令行的防火墙策略管理工具 四种防火墙策略&#xff1a; ACCEPT&#xff08;允许流量通过&#xff09; 流量发送方会看到响应超时的提醒&#xff0c;但是流量发送方无法判断流量是被拒绝&#xff0c;还是接收方主机当前不在线 REJECT&#xff08…