https://leetcode.com/problems/3sum/

1. Brute force(Time Limit Exceeded):

  1. //TLE
  2. class Solution {
  3. public:
  4. vector<vector<int>> threeSum(vector<int>& nums) {
  5. vector<vector<int>> result;
  6. if(nums.empty())
  7. return result;
  8. if(nums.size() <= 2)
  9. return result;
  10. int len = nums.size();
  11. int last = 2;
  12. for(int L = 0; L < len - 2; L++){
  13. for(int R = L + 1; R < len - 1; R++){
  14. last = R + 1;
  15. while(last < len){
  16. if(nums[last] == 0 - (nums[L] + nums[R])){
  17. vector<int> curr;
  18. curr.push_back(nums[L]);
  19. curr.push_back(nums[R]);
  20. curr.push_back(nums[last]);
  21. sort(curr.begin(), curr.end());
  22. result.push_back(curr);
  23. }
  24. last++;
  25. }
  26. }
  27. }
  28. sort(result.begin(), result.end());
  29. result.erase(unique(result.begin(), result.end()), result.end());
  30. return result;
  31. }
  32. };

2. Two pointers:

  1. //124 ms 19.6 MB
  2. class Solution {
  3. public:
  4. vector<vector<int>> threeSum(vector<int>& nums) {
  5. vector<vector<int>> result;
  6. if(nums.empty())
  7. return result;
  8. if(nums.size() <= 2)
  9. return result;
  10. sort(nums.begin(), nums.end());
  11. int n = nums.size();
  12. for(int i = 0; i < n - 2; ++i) {
  13. if (nums[i] > 0) break; // because sorted, first is positive -> not a set
  14. if (i > 0 && nums[i] == nums[i - 1]) //duplicates
  15. continue;
  16. int l = i + 1;
  17. int r = n - 1;
  18. while (l < r) {
  19. if (nums[l] + nums[i] + nums[r] == 0) {
  20. result.push_back({nums[l], nums[i], nums[r]});
  21. l++;
  22. r--;
  23. while (l < r && nums[l] == nums[l - 1]) //duplicates
  24. l++;
  25. while (l < r && nums[r] == nums[r + 1]) //duplicates
  26. r--;
  27. } else if (nums[i] + nums[l] + nums[r] < 0) {
  28. l++;
  29. } else {
  30. r--;
  31. }
  32. }
  33. }
  34. return result;
  35. }
  36. };

Time complexity: O(n log(n) + n^2)
Space complexity: O(1)