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 边界写错,漏遍历组合或重复配对。

相关推荐
Cccp.12318 分钟前
【leetcode】(一)认识复杂度和简单排序算法
算法·排序算法
boheweidexiatian26 分钟前
如何系统性地准备面试,把通过率提到最高?
面试·职场和发展·求职招聘
旖旎夜光27 分钟前
LeetCode 974:和可被 K 整除的子数组(前缀和) —— 题解
数据结构·c++·算法·leetcode·前缀和
无限码力31 分钟前
拼多多笔试真题 2026-8-30【唯一入栈出库序列】
算法·pdd笔试真题·拼多多春招笔试真题·拼多多秋招笔试真题·拼多多笔试真题题解·拼多多最新笔试题库
lvwangshu31 分钟前
分治:序列分治(CDQ)与点分治
算法·分治
无限码力36 分钟前
2026-8-30拼多多笔试真题-哪个查阅窗能留空(C++/Py/Java /Js/Go)
算法·pdd·pdd笔试真题·拼多多春招笔试真题·拼多多秋招笔试真题·拼多多笔试真题题解·拼多多笔试题解
luj_17681 小时前
毒素驱动的生物自毁机制探析
服务器·c语言·开发语言·经验分享·算法
一水鉴天1 小时前
问题分类的三元组映射体系与求解方法论 20260901(千问)
人工智能·算法·机器学习
breeze jiang1 小时前
LangChain Memory 实战:用 InMemoryChatMessageHistory 管理多轮对话
前端·算法·langchain