15. 三数之和

题目链接:15. 三数之和 - 力扣(LeetCode)

 

 

 

 

 

 

 

解析:

这题其实很简单,就是时间卡的太死,很离谱,确实是O(N^2)的方法,但循环里用个unorered_map都超时,

所以先排序,然后暴力就好了,暴力的基础上注意每层循环的值只取一次就ok,算不上优题,恶心题

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        std::unordered_map<int, int> vis;
        std::unordered_map<string, bool> ret_vis;
        set<string> h_set;
        for (int i = 0; i < nums.size(); i++) {
            vis[nums[i]] += 1;
        }
        sort(nums.begin(), nums.end());
        vector<vector<int>> ret;
        for (int i = 0; i < nums.size(); i++) {
            if (i > 0 && nums[i] == nums[i - 1]) continue;

            int a = nums[i];

            for (int j = i + 1; j < nums.size(); j++) {
                if (j > i + 1 && nums[j] == nums[j - 1]) continue;
                int b = nums[j];
                int c = 0 - a - b;

                if (vis[c] && c >= b) {
                    if ((a == b || a == c) && vis[a] < 2 || b == c && vis[b] < 2) {
                        continue;

                    }
                    if (a == b && a == c && vis[a] < 3) continue;

                    int x = std::min(a, std::min(b, c));
                    int z = std::max(a, std::max(b, c));
                    int y = 0 - x - z;
                    ret.push_back(vector<int> {a, b, c});
                    
                }
            }
        }

        return ret;
    }
};

 

posted @ 2025-07-27 20:56  WTSRUVF  阅读(4)  评论(0)    收藏  举报