自从我开始读研后,接触算法之类的就少了,这里重新开始练习算法,不知道什么时候能刷完,总之先记录下来这一步步的题解。
两数之和
解题思路: 核心思想依然是“边遍历,边查表”。我们维护一个哈希表,里面记录的是“已经遍历过的数字”以及“它们的下标”。对于每一个当前遍历到的数字 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 {};
}
};
函数调用差异点
- HashMap 变成了
unordered_map
- Java:
Map<Integer, Integer> map = new HashMap<>();(此处我倒是用map) - C++:
unordered_map<int, int> m;
containsKey()变成了find() != end()
- Java:
if (map.containsKey(mid)) - C++:
if (m.find(mid) != m.end())或者if (m.count(mid)) - ⚠️ 避坑提醒:C++ 没有直接的
containsKey。find()返回的是一个“激光笔”(迭代器),你要判断这个激光笔是不是指到了表尾之外的虚无空间(end())。
- 获取 Value:
get()变成了it->second
- Java:
int val = map.get(key); - C++:
int val = it->second;(如果已经 find 到了) 或者m[key] - ⚠️ 避坑提醒:用
find()找到目标后,一定要用->second把值取出来。C++ 的哈希表里存的是成对的数据(pair),first是键,second是值。
- 返回数组:
new int[]{...}变成了{...}
- Java:
return new int[]{a, b}; - C++:
return {a, b}; - ⚠️ 避坑提醒:C++11 引入了列表初始化
{}。不需要再像 Java 那样new一个数组出来,只要外层函数规定了返回vector<int>,直接return {变量1, 变量2},编译器会自动打包好。
- 增强 for 循环的隐藏开销
- Java:
for (int x : nums) - C++:
for (const auto& x : nums) - ⚠️ 避坑提醒:Java 里基本类型传值,对象传引用,这都是底层安排好的。但 C++ 给了选择权。如果不加
&(写成auto x),C++ 会死板地把每个东西都复制一份。为了追求极致性能,遍历时随手加上&是一定要养成的肌肉记忆。
