题解 | 三数之和

三数之和

https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711

#include <unordered_map>
#include <vector>
#include <algorithm> // 仅补充sort必需头文件(编译依赖)
using namespace std; // 仅补充命名空间(编译依赖)

class Solution {
  public:
    vector<vector<int> > threeSum(vector<int>& num) {
        vector<int>vec;
        vector<vector<int>>result;
        unordered_map<int, int>map;

        int left, right, target;
        sort(num.begin(), num.end());

        for (int i = 0; i < num.size(); i++) {
            if (i - 1 >= 0 && num[i - 1] == num[i]) continue;
            target = -1 * num[i];
            left = i + 1;
            right = num.size() - 1;

            map.clear(); // 每次i循环清空哈希表(核心修复)
            for (int j = left; j <= right; j++) {

                int bu = target - num[j];
                if (map.count(bu)) {
                    vec.push_back(num[i]);
                    vec.push_back(bu);
                    vec.push_back(num[j]);
                    result.push_back(vec);
                    vec.clear();
                    continue; // 找到后跳过当前j的map插入(避免重复)
                }

                vec.clear();
                map[num[j]] = j;
                // 将去重移到map操作之后,避免跳过[0,0,0]的匹配
                if (j > left && num[j - 1] == num[j]) {
                    // 找到重复后,若已命中则需要去重结果,这里先保证匹配能执行
                    continue;
                }
            }
        }
        //去重结果(修复重复三元组问题,最小改动)
        sort(result.begin(), result.end());
        result.erase(unique(result.begin(), result.end()), result.end());
        return result;
    }
};

全部评论

相关推荐

03-23 15:00
已编辑
厦门大学 Java
xiaowl:你这个简历的问题是对于技术点、项目的描述,都是描述action的,对于面试官而言,仅能知道你干了什么,无法判断你为什么这么干,干的好不好。
点赞 评论 收藏
分享
04-10 18:55
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务