LeetCode 1 两数之和

1. 题目

1. 两数之和

题目描述

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

  1. 每种输入只会对应一个答案;

  2. 数组中同一个元素不能使用两遍;

  3. 返回下标顺序不限。

示例

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

输出:0,1

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

输出:1,2

约束

  • (2 <= nums.length <= 10^4)

  • (-10^9 <= numsi <= 10^9)

  • 仅有一组有效解

2. 最佳解题思路描述(哈希表单次遍历,最优)

  1. 哈希表 unordered_map<int, int>:key 存数组数值,value 存对应下标;

  2. 遍历每个元素,计算互补值 diff = target - nums[i];

  3. 若哈希表存在 diff,说明前面已出现匹配数字,直接返回 {mp[diff], i};

  4. 不存在则把当前数字与下标存入哈希;

  5. 先查询、后存入,天然规避同一元素重复使用。

优势

时间 (O(n)),仅遍历一次数组;空间 (O(n));大数据不会超时,面试标准写法。

3. 可优化代码(暴力双层循环,逻辑正确但性能差)

复制代码
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> res ={};
        for(int i=0;i<nums.size()-1;i++){
            for(int j=i+1;j<nums.size();j++){
                if(nums[i]+nums[j]==target){
                    res.push_back(i);
                    res.push_back(j);
                    return res;
                }
            }
        }
        return res;
    }
};

代码说明

  1. 正确性:无逻辑 bug,所有测试用例均可通过;

  2. 缺陷与优化点:

    • 时间复杂度 (O(n^2)),数组长度接近 1e4 时会超时;

    • 外层循环条件 i < nums.size()-1 没必要,直接 i < nums.size() 更通用;

    • 找到答案后可直接 return {i,j},无需先创建 vector 再 push,代码更简洁;

    • 多余初始化空 vector,最后无匹配返回用不到。

4. 两套标准代码

版本 1:优化后的暴力写法(仅适合学习,不推荐面试)

复制代码
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int n = nums.size();
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                if (nums[i] + nums[j] == target) {
                    return {i, j};
                }
            }
        }
        return {};
    }
};

版本 2:哈希最优解法(考场首选)

复制代码
#include <unordered_map>
#include <vector>
using namespace std;
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> mp;
        int n = nums.size();
        for (int i = 0; i < n; ++i) {
            int diff = target - nums[i];
            if (mp.count(diff)) {
                return {mp[diff], i};
            }
            mp[nums[i]] = i;
        }
        return {};
    }
};

5. 总结

  1. 双层暴力思路直观,但效率极低,数据量大直接超时;

  2. 哈希表是本题最优解,核心思路:用空间换时间,缓存已遍历数字;

  3. 关键顺序:先查差值,再存当前值,避免自身相加错误;

  4. 题目保证必有一组解,循环内找到可直接 return,无需走完整个数组。

6. 相关知识拓展

拓展 1:复杂度对比

  • 双层循环:时间 (O(n^2)),空间 (O(1));

  • 哈希单次遍历:时间 (O(n)),空间 (O(n))(最优)。

拓展 2:同类题型延伸

  • LC15 三数之和:排序 + 双指针去重,不能单纯哈希;

  • LC167 两数之和 II - 输入有序数组:双指针,无需哈希。

拓展 3:高频易错点

  1. 先存入当前数字再查询差值,出现自身配对错误(如 nums=3, target=6);

  2. map 存储颠倒:把下标当 key、数值当 value,无法查找互补数;

  3. 暴力循环 i 与 j 边界写错,漏遍历组合或重复配对。

相关推荐
余额瞒着我当琳10 分钟前
C++算法学习篇5--二分查找法
c++·学习·算法
起个名字费劲死了21 分钟前
基于灰度/形状的2D模板匹配
算法
杜 硕26 分钟前
归并排序详解
数据结构·算法·排序算法
科技观察哨35 分钟前
国产纳米定位平台与精密位移台量产能力图谱(2026):Z轴压电、XYθZ、六自由度并联与光刻/检测/装配选型指南
网络·人工智能·算法
AIHR数智引擎2 小时前
蚂蚁350亿换不来智能体飞轮?拆中台和流水线
人工智能·经验分享·职场和发展·ai-native·aihr
鶴哥只手遮天2 小时前
《OpenFOAM 源码深度剖析》系列-第 3 章 字典系统、IO 体系与对象注册表
算法·开源
鶴哥只手遮天2 小时前
《OpenFOAM 源码深度剖析》系列-第 2 章 wmake:OpenFOAM 自研构建系统与编译配置体系
算法·开源
用户81849100742162 小时前
我把工位上的“AI牛马”养成了:一个技术人的 AiPy 实战手记
算法
Tisfy2 小时前
LeetCode 3727.最大交替平方和:排序 (双指针可选)
算法·leetcode·题解·贪心·数组·排序
鶴哥只手遮天2 小时前
《OpenFOAM 源码深度剖析》系列-第 9 章 有限体积离散框架:`fvMatrix`、`fvSchemes` 与 `fvSolution`
算法·开源