这道题也是经典的越写越复杂,最开始不能通过[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中寻找是否有匹配的keyauto iter = map.find(target - nums[i]); if(iter != map.end()) {return {iter->second, i};}// 如果没找到匹配对,就把访问过的元素和下标加入到map中map.insert(pair<int, int>(nums[i], i)); }return {};}
};