XingHuiSamaの宝藏之地
首页项目归档照片墙音乐灵境说说杂谈友链关于
封面

Leetcode一百题重刷——两数之和

2026-04-07 14:43:44
# Leetcode
# 题解
# 算法
# C++

自从我开始读研后,接触算法之类的就少了,这里重新开始练习算法,不知道什么时候能刷完,总之先记录下来这一步步的题解。

两数之和

解题思路: 核心思想依然是“边遍历,边查表”。我们维护一个哈希表,里面记录的是“已经遍历过的数字”以及“它们的下标”。对于每一个当前遍历到的数字 nums[i],我们去表中寻找是否存在一个数字等于 target - nums[i]。如果有,直接返回两者的下标;如果没有,就把当前数字和下标登记到表中。

class 两数之和 {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        map<int, int> m;
        for(int i = 0;i<nums.size();i++){
            int mid = target - nums[i];
            if(m.find(mid) != m.end()) {
                return {m.find(mid)->second,i};
            }
            else {
                m[nums[i]] = i;
            }
        }
        return {};
    }
};

函数调用差异点

  1. HashMap 变成了 unordered_map
  • Java: Map<Integer, Integer> map = new HashMap<>();(此处我倒是用map)
  • C++: unordered_map<int, int> m;
  1. containsKey() 变成了 find() != end()
  • Java: if (map.containsKey(mid))
  • C++: if (m.find(mid) != m.end()) 或者 if (m.count(mid))
  • ⚠️ 避坑提醒:C++ 没有直接的 containsKey。find() 返回的是一个“激光笔”(迭代器),你要判断这个激光笔是不是指到了表尾之外的虚无空间(end())。
  1. 获取 Value:get() 变成了 it->second
  • Java: int val = map.get(key);
  • C++: int val = it->second; (如果已经 find 到了) 或者 m[key]
  • ⚠️ 避坑提醒:用 find() 找到目标后,一定要用 ->second 把值取出来。C++ 的哈希表里存的是成对的数据(pair),first 是键,second 是值。
  1. 返回数组:new int[]{...} 变成了 {...}
  • Java: return new int[]{a, b};
  • C++: return {a, b};
  • ⚠️ 避坑提醒:C++11 引入了列表初始化 {}。不需要再像 Java 那样new 一个数组出来,只要外层函数规定了返回 vector<int>,直接 return {变量1, 变量2},编译器会自动打包好。
  1. 增强 for 循环的隐藏开销
  • Java: for (int x : nums)
  • C++: for (const auto& x : nums)
  • ⚠️ 避坑提醒:Java 里基本类型传值,对象传引用,这都是底层安排好的。但 C++ 给了选择权。如果不加 &(写成 auto x),C++ 会死板地把每个东西都复制一份。为了追求极致性能,遍历时随手加上 & 是一定要养成的肌肉记忆。
avatar

XingHuiSama

在代码、学术与分子动力学模拟间穿梭的普通人。近期正埋头于 GROMACS 模拟研究与神经网络计算。

RECOMMENDED

GROMACS 2025 分子动力学模拟初探2222

2026-03-24 07:00:45

Computational Chemistry Tool 工具二介绍

2026-04-01 07:00:23

Leetcode一百题——字母异位词分组

2026-04-07 15:34:18

Table of Contents