题目链接: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;} };