1两数之和

这道题也是经典的越写越复杂,最开始不能通过[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 {};
    }
};
posted @ 2025-01-09 22:07  名字好难想zzz  阅读(12)  评论(0)    收藏  举报