1. 两数之和
这题最直接的想法就是边遍历边查找。比如当前数字是 3,目标和是 9,那就去看 6 之前有没有出现过。这个场景很适合哈希表:既要判断某个值有没有出现过,又要记住它的下标。
这里我会优先用 std::unordered_map。题目不需要有序,没必要上 map,unordered_map 够快,也更贴合用途。
哈希表里,key 放元素值,value 放下标。遍历数组时,先查 target - nums[i] 是否已经在表里;如果在,直接返回两个下标;如果不在,就把当前元素塞进去。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> map;
for (int i = 0; i < nums.size(); i++) {
auto it = map.find(target - nums[i]);
if (it != map.end()) {
return {it->second, i};
}
map.insert({nums[i], i});
}
return {};
}
};
几个细节别混了:
map.find(...)返回的是迭代器,找不到时等于map.end()unordered_map存的是pair<const Key, Value>,所以用it->second取下标map.insert({nums[i], i})这里是把当前值和索引一起存进去- 如果模板里已经有
using namespace std,就不用再写std::
完整代码示例:
#include<bits/stdc++.h>
using namespace std;
class Solution {
public:
vector<> {
unordered_map<, > map;
( i = ; i < nums.(); i++) {
it = map.(target - nums[i]);
(it != map.()) {
{it->second, i};
}
map.({nums[i], i});
}
{};
}
};
{
n, target;
cin >> n >> target;
;
( i = ; i < n; i++) {
cin >> nums[i];
}
Solution solution;
vector<> result = solution.(nums, target);
cout << result[] << << result[] << endl;
;
}
