题目

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

你可以假设每种输入只会对应一个答案,且同一个元素不能重复使用。

思路

朴素解法是两层循环枚举所有对 O(n²),但可以用 哈希表优化到 O(n): 遍历数组,对每个元素 x 检查 target - x 是否已经在哈希表里。 如果在,直接返回两个下标;否则把 x 的值和下标存入哈希表。

C++ · two_sum.cpp
#include <vector>
#include <unordered_map>
using namespace std;

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> seen;  // 哈希表:{数值 → 下标}

        for (int c = 0; c < (int)nums.size(); c++) {
            int complement = target - nums[c];

            if (seen.count(complement)) {
                return {seen[complement], c};
            }
            seen[nums[c]] = c;
        }
        return {};  // 题目保证有解,不会执行到这里
    }
};

// --- 验证 ---
// twoSum([2, 7, 11, 15], 9)  →  [0, 1]
// twoSum([3, 2, 4],      6)  →  [1, 2]

复杂度分析

  • 时间复杂度:O(n),只遍历一次数组。
  • 空间复杂度:O(n),哈希表最多存 n 个元素。
今日感受

很经典的入门题。第一反应确实是暴力双循环,但仔细想一下 "我需要的另一半在不在?"这个问题,就自然引导到哈希表了。
哈希查找是 O(1),整体降到 O(n)——这种"用空间换时间"的思维值得记住。

今天是第一天,希望能坚持下去。就算某天只有10分钟,也要打开编辑器。

← 返回菜鸟的coding