https://leetcode.com/problems/3sum/
1. Brute force(Time Limit Exceeded):
//TLEclass Solution {public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;if(nums.empty())return result;if(nums.size() <= 2)return result;int len = nums.size();int last = 2;for(int L = 0; L < len - 2; L++){for(int R = L + 1; R < len - 1; R++){last = R + 1;while(last < len){if(nums[last] == 0 - (nums[L] + nums[R])){vector<int> curr;curr.push_back(nums[L]);curr.push_back(nums[R]);curr.push_back(nums[last]);sort(curr.begin(), curr.end());result.push_back(curr);}last++;}}}sort(result.begin(), result.end());result.erase(unique(result.begin(), result.end()), result.end());return result;}};
2. Two pointers:
//124 ms 19.6 MBclass Solution {public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;if(nums.empty())return result;if(nums.size() <= 2)return result;sort(nums.begin(), nums.end());int n = nums.size();for(int i = 0; i < n - 2; ++i) {if (nums[i] > 0) break; // because sorted, first is positive -> not a setif (i > 0 && nums[i] == nums[i - 1]) //duplicatescontinue;int l = i + 1;int r = n - 1;while (l < r) {if (nums[l] + nums[i] + nums[r] == 0) {result.push_back({nums[l], nums[i], nums[r]});l++;r--;while (l < r && nums[l] == nums[l - 1]) //duplicatesl++;while (l < r && nums[r] == nums[r + 1]) //duplicatesr--;} else if (nums[i] + nums[l] + nums[r] < 0) {l++;} else {r--;}}}return result;}};
Time complexity: O(n log(n) + n^2)
Space complexity: O(1)
