这道题也是经典的越写越复杂,最开始不能通过[3,3],6。然后就写判断map1[target-nums[i]]!=map1[nums[i]].还是不能通过,然后换成multimap,换完之后也不行。然后去查怎么获得相同key的value,然后知道了equal.range()。最后终于也是写出来了,但是花了好长时间。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_multimap<int, int> map1;
vector<int> index1;
for (int i = 0; i < nums.size(); i++) {
map1.insert(std::make_pair(nums[i], i));
}
for (int i = 0; i < nums.size(); i++) {
auto range1 = map1.equal_range(target - nums[i]);
for (auto it = range1.first; it != range1.second; ++it) {
if (it->second != i) { // 确保不是同一个元素
index1.push_back(i);
index1.push_back(it->second);
return index1;
}
}
}
return {};
}
};
后面看代码随想录发现解决方法就很简单,只需要先检查是否有解,然后再添加当前处理的元素就行了。由于对输出答案的顺序没有要求,而前面错过的元素后面也是能找到的,因此能得到正确答案。下次还是要设定时间写
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map <int,int> map;
for(int i = 0; i < nums.size(); i++) {
// 遍历当前元素,并在map中寻找是否有匹配的key
auto iter = map.find(target - nums[i]);
if(iter != map.end()) {
return {iter->second, i};
}
// 如果没找到匹配对,就把访问过的元素和下标加入到map中
map.insert(pair<int, int>(nums[i], i));
}
return {};
}
};
标签:map,target,nums,int,map1,vector,两数
From: https://www.cnblogs.com/gqzz/p/18662983