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.length
  for (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 != j
    	    0       0      num[0]=1    num[0]=1                       false
    	    0       1      num[0]=1    num[1]=2                       false
    	    0       2      num[0]=1    num[2]=3                       false
    	    0       3      num[0]=1    num[3]=4                       false
    	    0       4      num[0]=1    num[4]=11                      false
    	    0       5      num[0]=1    num[5]=15                      false
    	    0       6      num[0]=1    num[6]=22                      false
    	    0       7      num[0]=1    num[7]=78                      false
    	    0       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 != j
    	    1       0      num[1]=2    num[0]=1                       false
    	    1       1      num[1]=2    num[1]=2                       false
    	    1       2      num[1]=2    num[2]=3                       false
    	    1       3      num[1]=2    num[3]=4                       false
    	    1       4      num[1]=2    num[4]=11                      false
    	    1       5      num[1]=2    num[5]=15                      false
    	    1       6      num[1]=2    num[6]=22                      false
    	    1       7      num[1]=2    num[7]=78                      false
    	    1       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.length
  for (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           maps
    0          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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

51单片机学习笔记11 使用DS18B20温度传感器

51单片机学习笔记11 使用DS18B20温度传感器 一、DS18B20简介1. 主要特点2. 工作原理3. 引脚说明4. ROM 二、1-wire协议简介1. 总线结构&#xff1a;2. 通信方式&#xff1a;3. 数据传输&#xff1a;4. 设备识别&#xff1a;5. 供电方式&#xff1a;6. 应用场景&#xff1a;7. 优…

vue页面实现旋转饼图

一、示例图片 二、参考 3D饼图-半透明 - ECharts图表集,echarts gallery社区,Make A Pie,分享你的可视化作品isqqw.com 三、实现 1、自定义组件RotatingPieChart.vue <template><div>【旋转饼图】</div><div ref"chart" class"chart-c…

C语言单链表的窗口化操作

#include <stdio.h> #include <stdlib.h>// 定义链表的节点结构 struct Node {int data;struct Node* next; };// 初始化链表 void initialize(struct Node** head) {*head NULL; }// 在链表末尾插入节点 void insert(struct Node** head, int value) {// 创建新节…

基于BEV的自动驾驶会颠覆现有的自动驾驶架构吗

基于BEV的自动驾驶会颠覆现有的自动驾驶架构吗 引言 很多人都有这样的疑问–基于BEV(Birds Eye View)的自动驾驶方案是什么&#xff1f;这个问题&#xff0c;目前学术界还没有统一的定义&#xff0c;但从我的开发经验上&#xff0c;尝试做一个解释&#xff1a;以鸟瞰视角为基础…

Web框架开发-Form组件和ajax实现注册

一、注册相关的知识点 1、Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面建一个forms.py的文件来存放 2、局部钩子函数 1 2 3 4 5 6 7 # 局部钩子函数 def clean_username(self): userna…

《QT实用小工具·六》代码行数统计工具

1、概述 源码放在文章末尾 该项目实现了对不同编程语言文件的代码行数的统计 统计的内容包含&#xff1a; 1、代码行数 2、注释行数 3、空白行数 下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; #pragma execution_character_set("utf-8")#inclu…

区块链食品溯源案例实现(一)

引言&#xff1a; 食品安全问题一直是社会关注的热点&#xff0c;而食品溯源作为解决食品安全问题的重要手段&#xff0c;其重要性不言而喻。传统的食品溯源系统往往存在数据易被篡改、信息不透明等问题&#xff0c;而区块链技术的引入&#xff0c;为食品溯源带来了革命性的变革…

【ProComponents】解决 ProTable 中 params 参数改变,request 函数未触发问题

文章目录 先建议自查下官方文档&#xff0c;了解params和request直接的关系 确定params绑定的参数是否改变&#xff0c;例如 user_name 参数 import { ProTable, WxIcon } from /components; import { getSearchParams } from ice; import { useEffect, useMemo, useRef, useS…

智慧公厕是什么?智慧公厕的主要功能、特点?

智慧公厕&#xff0c;顾名思义&#xff0c;是指应用了智能科技的公共厕所&#xff0c;旨在提供更加便捷、舒适、智能化的卫生服务。相比传统的公厕&#xff0c;智慧公厕不仅拥有更加智能化的设备&#xff0c;还配备了远程监控与管理系统&#xff0c;以及节能环保技术&#xff0…

优化页面加载时间:改善用户体验的关键

✨✨ 祝屏幕前的您天天开心&#xff0c;每天都有好运相伴。我们一起加油&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一、为什么页面加载时间重要&#xff1f; 二、如何减少页面加载时间&#xff1f; …

SiLM824x系列SiLM8244 配置为高、低边驱动 支持死区可编程,隔离双通道门级驱动器

SiLM824x系列SiLM8244是一款具有不同配置的隔离双通道门极驱动器。SiLM8244配置为高、低边驱动&#xff0c;SiLM8244可提供4A的输出源电流和6A的灌电流能力&#xff0c;并且其驱动输出电压可以支持到33V。支持死区可编程&#xff0c;通过调整DT脚外部的电阻大小&#xff0c;调整…

基于单片机汽车超声波防盗系统设计

**单片机设计介绍&#xff0c;基于单片机汽车超声波防盗系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机汽车超声波防盗系统设计概要主要涉及利用超声波传感器和单片机技术来实现汽车的安全防盗功能。以下是对…

注册接口和前置SQL及数据生成及封装

注册接口 演示注册接口的三步操作&#xff1a;【注册流程逻辑】 第一步&#xff1a;发送注册短信验证码接口请求 请求方法&#xff1a; put 请求地址&#xff1a;http://shop.lemonban.com:8107/user/sendRegisterSms 请求参数&#xff1a;{“mobile”:“13422337766”} 请求头…

【面试专题】Mybatis高频面试题

一、介绍下MyBatis中的工作原理 1。介绍MyBatis的基本情况&#xff1a;ORM 2。原理&#xff1a; MyBatis框架的初始化操作处理SQL请求的流程 1.系统启动的时候会加载解析全局配置文件和对应映射文件。加载解析的相关信息存储在 Configuration 对象 Testpublic void test1(…

C++算法补充---STL

这里写目录标题 CSTL容器字符串函数(string容器函数)字符串转字符 算法交换函数拿到容器或者数组的第一个最大&#xff08;小&#xff09;值元素的下标或者值排序函数求字符数组的有效长度atoi函数&#xff08;将字符串类型的数字转为真正的int型数字&#xff09;string转字符 …

STM32八种I/O口模式

STM32八种I/O口模式 文章目录 STM32八种I/O口模式前言一、stm32八种I/O类型二、区别1.模拟输入2.浮空输入3.上拉输入4.下拉输入5.推挽输出6.开漏输出7.复用推挽输出8.复用推挽输出 总结 前言 作为两年嵌入式软件攻城狮&#xff0c;还没仔细去理解过STM32的GPIO的八种使用模式&…

企业招聘,应用MBTI来做人才测评招聘测评

每年的校招季都是企业争抢优秀应届毕业生人才的忙碌季。只有精准识人用人&#xff0c;才能不断为企业注入新鲜活力和青春智慧。但是随着毕业生数量越来越多&#xff0c;企业如何在招聘中精准发现自己最需要的人才&#xff0c;成为摆在人力资源部门的大难题。人才测评是各企业都…

springboot在线学习做题答题统计系统-可视化分析系统

系统阐述的是使用可视化的学习系统的设计与实现&#xff0c;对于java、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 springboot框架和MySql数据库技术搭建系统的整体架构。…

【分析教程】unity游戏修改so文件

基础知识 0x1.apk安装后在手机中的目录 apk安装后会在两个包下生成相关包&#xff1a;data/data/、data/app/。 这里拿网易云音乐的安装目录举例。Data/App目录下通常会有三个文件&#xff1a; lib文件夹&#xff08;包含so库文件&#xff09;、 ‚oat文件夹&#xff08;O…

算法系列--递归,回溯,剪枝的综合应用(2)

&#x1f495;"对相爱的人来说&#xff0c;对方的心意&#xff0c;才是最好的房子。"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–递归,回溯,剪枝的综合应用(2) 大家好,今天为大家带来的是算法系列--递归,回溯,剪枝的综合应用(2) 一.括号…