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

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n = nums.size();
        sort(nums.begin(), nums.end());
        vector<vector<int>> ans;
 
        for(int i=0;i<n;i++){
            if(i > 0 && nums[i] == nums[i-1]) continue;  // for unique i [1,2,2,2,2,3,4] // use 2 element once
 
            int target = -1 * nums[i];
            int s = i + 1;
            int e = n - 1;
            while(s<e){
                int sum = nums[s] + nums[e];
 
                if (sum > target){
                    e--;
                } else if (sum < target){
                    s++;
                } else {
                    ans.push_back({nums[i], nums[s], nums[e]});
                    s++;
                    e--;
                    while(s <e && nums[s] == nums[s-1]) s++; // [0,0,0,0] // unique s
                    while(s <e && nums[e] == nums[e+1]) e--; // [0,0,0,0] // unique e
                }
            }
        }
        return ans;
    }
};

4Sum

 
// 1 1 1 2 2 2 3 3 3 4 4 4 5 5 
// target = 8 
 
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        sort(nums.begin(), nums.end());
 
        int n = nums.size();
        vector<vector<int>> ans;
 
        for(int i=0;i<n;i++){
            if(i>0 and nums[i]==nums[i-1]) continue;
            for(int j = i+1; j < n; j++){
                if(j!=i+1 and nums[j]==nums[j-1]) continue; // imp j!=i+1
 
                int s = j+1, e = n-1;
                while(s < e)
                {
                    long long totalSum = (long long)nums[i] + (long long)nums[j] + (long long)nums[s] + (long long)nums[e];
 
                    if (totalSum > target) {
                        e--;
                    } else if (totalSum < target) {
                        s++;
                    } else {
                        ans.push_back({nums[i], nums[j], nums[s], nums[e]});
                        e--;
                        s++;
                        while(s<e && nums[s] == nums[s-1]) s++; // missed = s-1 made it s+1
                        while(s<e && nums[e] == nums[e+1]) e--; // 
                    }
                }
            }
        }
 
        return ans;
    }
};