LeetCode 1 Two Sum——在数组上遍历出花样

leetcode解题笔记:Two sum系列解题思路 Two Sum 3Sum 3Sum Closest Two SumGiven an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution, 阅读详情

本文始发于个人公众号:TechFlow

今天是周末,和大家一起来看一道算法题。这道题是大名鼎鼎的LeetCode的第一题,也是面试当中非常常见的一道面试题。题目不难,但是对于初学者来说应该还是很有意思,也是一道很适合入门的算法题。

废话不多说,让我们一起来看看题目吧。

Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.

翻译

给定一个全是int的数组和一个整数target,要求返回两个下标,使得数组当中这两个下标对应的和等于target。
你可以假设一定值存在一个答案,并且一个元素不能使用两次。

解答

找两个数和等于target,第一反应就是暴力枚举。假设数组长度是n,那么一个
n2的循环就可以搞定。用Python的话,分分钟就可以写出代码。

for i in range(len(array)):
    for j in range(len(array)):
        if array[i] + array[j] == target:
            return [i, j]

这样做当然是正确的,但显然不是最好的答案。根据经验,一般情况下O(n2)的算法都不是最优解。

引入map

如果你熟悉C++ STL或者其他语言工具库的用法,想必应该很容易想到可以使用map。map是一个非常常用的容器,用来存储key-value格式的数据对。
在这道题当中,我们可以将元素和它在数组当中对应的下标存储进map当中。也就是说我们把所有数据对应的下标存储好了之后,我们在遍历的时候,就可以去掉j那一重循环,而直接判断target−a[j]在不在map当中即可。

我们继续写出伪代码:

for i in range(len(array)):
    map[array[i]] = i;
    if target - array[i] in map:
        return [i, map[target - array[i]]]

这个算法看起来没什么问题,但是如果你这么写出代码来提交一定过不了。

因为有一种隐藏的情况没有考虑到,一般我们会把这种隐藏的不容易想到的情况称作“Trick”,可以看做是出题人使用的诡计。

题目当中说了,同一个元素不能使用两次,但是并没有说数组当中没有重复的元素。map的使用有一个限制,就是不能有key值相同的元素。如果数组当中存在重复的元素,那么后面读到的数据会覆盖前面的。覆盖会产生什么问题呢?会导致我们没有办法判断元素出现的次数。

举个例子,比如:target=6, array=[3, 3]

由于我们使用了map,我们在记录下第二个3的时候,就会损失第一个3的信息。这样我们就会错过答案,不过这个问题也并不是不能解决,我们可以用一个标记记录一下,是否有重复的数字或者是重复的数字是什么。不过这并不是完美的解决方案,我们没有想到完美解法,是因为有一个潜在的条件被我们忽略了。

这个条件就是加法的交换律,也就是说a+b=target,那么b+a也应该等于target。这当然是一个废话,但如果a和b之间存在顺序的话就不一样了。如果a的顺序在b前面,那么我们应该通过a去找b呢,还是应该通过b去找a?

当然是通过b去找a,因为a在b之前,我们可以利用之前已经遍历过的信息查找。如果通过a去找b,那么我们需要再开辟一个循环遍历。

想明白了这点,剩下的就简单了。

假设数组array一共有n个元素,分别是a0,a1,⋯,an−1。我们用一个map存储之前出现过的元素的下标,当我们遍历到i的时候,我们只需要判断target−ai在不在map当中即可。

因为假设存在ai+aj=target,i<j。当我们指针遍历到i的时候找不出答案,因为aj的值还没有出现在map中。但是当我们遍历到j的时候,一定可以找到答案,因为ai已经出现过了。

通过利用加法交换律以及元素出现的先后顺序,再结合map,我们只需要一次遍历就可以找到答案。就算出现重复元素,也没有关系,因为我们是先判断存不存在,再更新map。

最后,附上伪代码:

for i in array.length:
    if target - array[i] in map:
        return i, map[target - array[i]]
    else:
        map.put(array[i], i)

这题本身并不难解,用到的知识也平淡无奇,不过要想能琢磨出其中的trick,并想到解法,并不容易,需要基于充分的思考和理解。

简单题也能有所收获,祝大家刷题愉快。

如果喜欢本文,请顺手给个关注吧:

Leetcode-How-What 力扣Leetcode刷题指南 Leetcode-How-What 力扣Leetcode刷题指南 About the way how to use Leetcode wisely for preparing the interview and the solutions to some Leetcode problems’. 怎样为准备面试机智聪明的刷题(高效刷题)以及一些题目的题解。 同 github 链接: https:/... 阅读详情

相关推荐

Leetcode: 1.Two Sum 两数之和

Two Sum 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 输入: nums = [2, 7, 11, 15], target = 9 输出: [0, 1] 因为 nums[0] + nums[1] = 2 + 7 = 9 ...

Coding 1690

educoder指针与数组

题目来源: educoder 题目 题目要求 编程要求 右侧编辑器中有一个函数Split,它有两个参数arr和len,arr指向一个数组,这个数组的长度是len。 arr数组只包含1,0两种值,请在这个函数中补充代码,将这个数组中的0都放在数组的左边(即地址值小的那一边),1都放在数组的右边。 输入数据由评测系统读取,并传递给Split函数,然后会将arr所指的数组的内容输出。详细见测试说明。 测试说明 平台会对你编写的代码进行测试: 预期输入: 5 1 0 1 1 1 预期输出: 0 1 1 1 1 预期

m0_46183615的博客 4159

大数据之VIP(Virtual IP,虚拟IP)负载均衡

VIP(Virtual IP,虚拟IP)负载均衡是一种在计算机网络中常用的技术,用于将网络请求流量均匀地分散到多个服务器上,以提高系统的可扩展性、可靠性和性能。

赵玉的专栏 4122

2020JS必看面试题

1. javascript的typeof返回哪些数据类型. 答案:string,boolean,number,undefined,function,object 2. 例举3种强制类型转换和2种隐式类型转换? 答案:强制(parseInt,parseFloat,number) 隐式(== ===) 3. split() join() 的区别 答案:前者是将字符串切割成数组的形式,后者是将数组转换成...

weixin_45151960的博客 11万+

深入解析五大ADC芯片架构及其应用场景

本文深入解析了五大ADC芯片架构及其应用场景,包括逐次逼近型ADC、Σ-Δ型ADC、流水线型ADC、闪存型ADC和积分型ADC。通过详细的架构分析和实际应用案例,帮助工程师理解不同ADC芯片的特点和适用场景,提升电路设计效率。

weixin_28702105的博客 354

模仿学习(Imitation Learning)概述

什么是模仿学习呢?简单来说,模仿学习(Imitation Learning),就是要训练机器能够复制人类的连续动作,进而达到模仿的目的。其实,Imitation Learning的实用性很高,假设今天有一个训练场景,你不知道该怎么定奖励值(reward),但是你可以收集到专家的示范数据(expert demonstration data),你就可以考虑用Imitation Learning这个方法。因此,模仿学习也被寄予很高的期待,成为下一代强人工智能的关键技术。......

qq_22749225的博客 2万+

C语言头歌educoder实训作业答案分享 指针(三)

第1关:指针作为函数参数 本关任务:计算一个数组中除最大数字之外的数字之和。 相关知识 指针形参 指针既然也是一种数据类型,自然也可以作为函数的形式参数。一般使用指针来让函数能修改外部内容,或者传递体积比较大的内容。 编程要求 右侧编辑器中有一个函数Sum,它有两个参数arr和len,代表一个数组和这个数组的长度。 请在这个函数中补充代码,计算除数组最大元素之外其他元素的和,并将其输出,占一行。 注意:如果数组长度为0,则结果也是0。 输入数据由评测系统读取,并传递给Sum函数。具体见测试

m0_62009942的博客 1万+

ADXL355 STM32 HAL 库 SPI 驱动实战:从零构建高精度加速度数据采集系统

本文详细介绍了如何使用STM32 HAL库通过SPI接口驱动ADXL355高精度加速度计,构建稳定可靠的数据采集系统。从硬件连接到寄存器配置,再到数据采集与处理,提供了完整的实战代码和优化技巧,特别适合工业级振动监测等应用场景。

weixin_28738397的博客 324

【CODE】Subarray Sum Equals K

560.Subarray Sum Equals K Medium 283976FavoriteShare Given an array of integers and an integerk, you need to find the total number of continuous subarrays whose sum equals tok. Example 1: Inp...

Li_Jiaqian的博客 340

SQL Server 2025在Windows 11上的安装避坑指南

SQL Server 是微软主流关系型数据库管理系统,其安装与Windows操作系统深度耦合;Windows 11作为新一代桌面平台,强化了基于虚拟化的安全(HVCI)、驱动签名强制策略(WDAC)及内核隔离机制,导致传统数据库部署流程失效。理解二者底层交互原理,是解决服务启动失败、配置管理器无法打开、远程连接被拒等高频问题的技术前提。本文聚焦SQL Server 2025与Windows 11的兼容性挑战,覆盖系统预配置、安装节点诊断、防火墙与服务权限调优等工程实践环节,适用于高校教学、电赛备赛、中小企业

weixin_28741413的博客 315

TJA1445/TJA1465 CAN收发器硬件设计与软件配置实战指南

控制器局域网(CAN)总线是汽车电子和工业控制领域实现电子控制单元(ECU)间可靠通信的核心技术。其工作原理是将数字信号转换为差分信号进行抗干扰传输,技术价值在于构建稳定、高效的分布式实时控制系统。随着汽车电子架构向域集中式演进,对CAN总线的通信速率、网络复杂度和静态功耗提出了更高要求,这催生了支持CAN FD协议和智能电源管理的新一代高速CAN收发器。在车载网关、域控制器及工业网络节点等应用场景中,NXP的TJA1445和TJA1465系列收发器凭借其部分组网(Partial Networking)和选

weixin_29655587的博客 405

【小知识点总结】Java中的split函数的用法(二)

split函数的使用、阿里开发手册的问题解决

Jason_996的博客 2147

智元机器人开源具身仿真框架 Genie Sim 入门教程

GenieSim是AgiBot推出的具身智能仿真框架,提供完整闭环开发管道,包括轨迹生成、模型训练和基准测试。框架支持Docker容器化部署,要求Ubuntu 22.04和NVIDIA硬件环境。主要功能涵盖: 支持12种基准测试任务 提供ADER评估框架 集成UniVLA/RDT等基线模型 支持PICO/键盘遥操作 具备轨迹记录回放功能 提供完整API控制接口 开发者可通过Hugging Face获取场景资产,使用标准化ROS主题与仿真环境交互。框架特别优化了碰撞检测和抓取物理模拟,适用于从简单抓取到复杂操

2506_90492529的博客 2535

数组遍历_LeetCode 1 Two Sum——在数组上遍历出花样

本文始发于个人公众号:TechFlow今天是周末,和大家一起来看一道算法题。这道题是大名鼎鼎的LeetCode的第一题,也是面试当中非常常见的一道面试题。题目不难,但是对于初学者来说应该还是很有意思,也是一道很适合入门的算法题。废话不多说,让我们一起来看看题目吧。Given an array of integers, return indices of the two numbers such t...

weixin_35472986的博客 94

【人工智能】国产开源大模型聊天 AquilaChat 快速开始上手实战&效果评测

Aquila语言大模型在技术上继承了GPT-3、LLaMA等的架构设计优点,替换了一批更高效的底层算子实现、重新设计实现了中英双语的tokenizer,升级了BMTrain并行训练方法,在Aquila的训练过程中实现了比Magtron+DeepSpeed zero-2将近8倍的训练效率。Aquila语言大模型是在中英文高质量语料基础上从0开始训练的,通过数据质量的控制、多种训练的优化方法,实现在更小的数据集、更短的训练时间,获得比其它开源模型更优的性能。

AI天才研究院 2万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

两个数组找相同元素_LeetCode 1 Two Sum——在数组上遍历出花样

本文始发于个人公众号:TechFlow今天是周末,和大家一起来看一道算法题。这道题是大名鼎鼎的LeetCode的第一题,也是面试当中非常常见的一道面试题。题目不难,但是对于初学者来说应该还是很有意思,也是一道很适合入门的算法题。废话不多说,让我们一起来看看题目吧。Given an array of integers, return indices of the two numbers such t...

weixin_39763902的博客 535

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

遍历数组找重复值_LeetCode 1 Two Sum——在数组上遍历出花样

今天是周末,和大家一起来看一道算法题。这道题是大名鼎鼎的LeetCode的第一题,也是面试当中非常常见的一道面试题。题目不难,但是对于初学者来说应该还是很有意思,也是一道很适合入门的算法题。​废话不多说,让我们一起来看看题目吧。Given an array of integers, return indices of the two numbers such that they add up to...

weixin_39689347的博客 602

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LeetCode 1. Two Sum 题解

本题是算法的经典入门问题,主要考察对哈希表的理解和应用。通过使用哈希表,我们可以将时间复杂度从 O(n²) 降低到 O(n),大大提高了算法的效率。哈希表的核心思想是:通过哈希表来存储已经遍历过的元素及其下标,这样当我们遍历到当前元素时,可以在 O(1) 的时间复杂度内检查目标值与当前元素的差值是否已经存在于哈希表中。这种方法不仅适用于两数之和问题,还可以应用于许多其他需要快速查找元素的场景。掌握哈希表的使用,对于解决这类问题非常重要。

cannonjinx的博客 4192

用 ES6 Map 一次遍历搞定 LeetCode 1. Two Sum | 超简洁模板题详解

Two Sum 作为 LeetCode 开篇第一题,常年位居「最多提交」排行榜榜首。它看似人畜无害,实则暗藏玄机

weixin_48221903的博客 1115

[LeetCode] No.1 Two Sum

“做程序员太辛苦了,我想换行……我该怎么办?” “敲一下回车。” Two Sum(两数之和) 题目: Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would...

但行好事 莫问前程 348

LeetCode 1 Two Sum题解

题目地址:https://leetcode.com/problems/two-sum/ 1. Two Sum 难度:简单 Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that e

赞美月亮的专栏 665

Leetcode 1.Two Sum

Leetcode 1.Two Sum 一、题目描述 这是 Leetcode 上面的第一题,非常的经典,在面试中也十分常见。 难度:easy 标签:数组 哈希表 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = ...

roseduan 的个人博客 452

哈希表解Two Sum问题

本文介绍了解决Two Sum问题的优化方法。该问题要求从整数数组中找到和为给定目标值的两个数的下标。通过使用哈希表存储已遍历元素及其索引,可将查找时间从O(N²)降至O(N)。具体步骤是:遍历数组时,检查哈希表中是否存在与当前元素配对的差值,若存在则返回结果,否则将当前元素存入哈希表。这种方法只需一次遍历,时间复杂度为O(N),空间复杂度为O(N)。示例展示了该方法的高效性,如nums=[2,7,11,15], target=9时,仅需两次遍历即可找到解[0,1]。

Frost_Descent的博客 1829

从Two Sum到N皇后:leetcode-rust中经典算法题的Rust实现

leetcode-rust是一个专注于用Rust语言实现LeetCode算法题的开源项目,包含了从简单到困难的多种经典算法问题的解决方案。本文将带你探索这个项目中两个具有代表性的算法实现,展示Rust在解决算法问题时的优雅与高效。 ## 入门级经典:Two Sum的Rust实现 🚀 Two Sum作为LeetCode的第一道题目,是很多人算法之旅的起点。在leetcode-rust项目中,这

gitblog_00897的博客 681
上一篇: 大数据基石——Hadoop与MapReduce
下一篇: LeetCode 2 Add Two Numbers——用链表模拟加法
TechFlow
博客等级 码龄7年 347粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值