news 2026/4/23 15:50:03

力扣解题-两数之和

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
力扣解题-两数之和

力扣解题-两数之和

题目:
给定一个整数数组 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]
提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

Related Topics
数组
哈希表


第一次解答

解题思路

核心方法:哈希表预存全量元素 + 二次遍历查找补值,利用哈希表O(1)的平均查找效率,将时间复杂度从暴力解法的O(n²)优化至O(n)。

具体步骤:

  1. 初始化一个HashMap,用于存储数组中的「数值-对应下标」键值对,后续通过数值快速反查下标。
  2. 第一次遍历整数数组nums,将数组中所有元素的「数值」作为key、「元素下标」作为value,完整存入HashMap中(注:若存在重复数值,后遍历到的元素下标会覆盖先存入的下标,由于题目保证仅有一个有效答案,该覆盖不影响最终结果)。
  3. 第二次遍历整数数组nums,对于当前遍历到的下标i对应的元素nums[i],计算得到与之匹配的「补值」other = target - nums[i](即需要找到的另一个和为target的整数)。
  4. 校验两个核心条件:①HashMap中包含补值other(存在对应的整数);②HashMap中补值other对应的下标不等于当前下标i(避免重复使用同一个数组元素)。
  5. 若满足上述两个条件,说明找到有效答案,立即将当前下标i和补值other对应的下标封装为结果数组,终止遍历以减少无意义开销。
  6. 返回最终结果数组。

提交后耗时5ms

publicint[]twoSum(int[]nums,inttarget){int[]result=null;Map<Integer,Integer>map=newHashMap<>();for(inti=0;i<nums.length;i++){map.put(nums[i],i);}for(inti=0;i<nums.length;i++){intother=target-nums[i];if(map.containsKey(other)&&map.get(other)!=i){result=newint[]{i,map.get(other)};break;}}returnresult;}

第二次解答

解题思路

核心方法:一次遍历 + 边存边查补值,在第一次解答的基础上优化遍历次数,进一步提升实际运行效率,时间复杂度仍为O(n)且执行开销更低。

具体步骤:

  1. 初始化一个HashMap,用于存储数组中的「数值-对应下标」键值对,仅存储当前遍历元素之前的数组元素。
  2. 仅进行一次遍历整数数组nums,遵循「先查补值,后存当前元素」的逻辑,避免重复匹配:
    a. 对于当前遍历到的下标i对应的元素nums[i],先计算匹配补值other = target - nums[i]
    b. 校验两个核心条件:①HashMap中包含补值other;② 补值other对应的下标不等于当前下标i(避免重复使用同一元素)。
    c. 若满足条件,直接封装当前下标i和补值other对应的下标为结果数组,终止遍历。
    d. 若不满足条件,将当前元素的「数值」和「下标」存入HashMap,继续遍历下一个元素。
  3. 返回最终结果数组。

核心优化点说明:

  • 合并两次遍历为单次遍历,减少了数组的整体访问次数,是耗时从5ms降至2ms的关键。
  • 「边存边查」仅存储前置元素,既保证了有效答案的匹配(两个答案元素必然一前一后出现),又避免了第一次解答中后续元素覆盖前置元素下标的潜在问题,逻辑更严谨。

提交后耗时2ms

publicint[]twoSum(int[]nums,inttarget){int[]result=null;Map<Integer,Integer>map=newHashMap<>();for(inti=0;i<nums.length;i++){intother=target-nums[i];if(map.containsKey(other)&&map.get(other)!=i){result=newint[]{i,map.get(other)};break;}map.put(nums[i],i);}returnresult;}

总结

  1. 两次解答均采用「哈希表」实现快速查找,核心思想是「时间换空间」,将查找效率从O(n)优化至O(1),整体时间复杂度均为O(n)。
  2. 第一次解答是「预存全量元素 + 二次查找」,逻辑简单直观;第二次解答是「单次遍历 + 边存边查」,优化了遍历次数,实际运行效率更高。
  3. 两次解答均遵循「避免重复使用同一元素」的核心约束,且满足题目「任意顺序返回答案」的要求。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 14:31:08

HandBrake 是什么?视频转码工具使用与服务器部署教程

在日常处理视频素材时&#xff0c;很多人都会遇到一个非常现实的问题&#xff1a; 视频清晰度还可以&#xff0c;但体积太大、格式不统一、播放兼容性差。 尤其是在这些场景下&#xff0c;转码几乎是绕不开的步骤&#xff1a; 视频归档与长期存储 多设备播放适配 网站或系统…

作者头像 李华
网站建设 2026/4/23 12:49:06

Scyliorhinin II amide (dogfish) ;SPNSKCPDGPDCFVGLM-NH₂

一、基础理化性质 英文名称&#xff1a;Scyliorhinin II amide (dogfish)三字母序列&#xff1a;Ser-Pro-Ser-Asn-Ser-Lys-Cys-Pro-Asp-Gly-Pro-Asp-Cys-Phe-Val-Gly-Leu-Met-NH₂单字母序列&#xff1a;SPNSKCPDGPDCFVGLM-NH₂关键特征&#xff1a;含1 个碱性氨基酸&#xff…

作者头像 李华
网站建设 2026/4/23 12:56:56

网络安全到底是什么,怎么防护,一篇全告诉你!

一、网络安全定义 网络安全是组织用来保护其应用程序、数据、程序、网络和系统免受网络攻击和未经授权访问的一套标准和做法。随着攻击者使用新技术和社会工程手段向组织和用户勒索钱财、破坏业务流程以及窃取或破坏敏感信息&#xff0c;网络安全威胁的复杂程度正在迅速增加。…

作者头像 李华
网站建设 2026/4/18 9:37:44

Strapping管脚全解析:硬件配置核心指南

目录 一、Strapping 管脚的核心定义与核心作用 1. 核心定义 2. 核心作用 二、Strapping 管脚的工作原理 1. 三个核心工作阶段 2. 核心硬件组成 三、Strapping 管脚的关键特性 四、Strapping 管脚的常见配置功能 1. 启动模式配置&#xff08;最核心&#xff0c;MCU/FPG…

作者头像 李华