vector<vector<int>> fourSum(vector<int>& nums, int target) { vector<vector<int>> res; if (nums.empty()) return res; std::sort(nums.begin(),nums.end()); for (int i = 0; i < nums.size(); i++) { int target3 = target - nums[i]; for (int j = i+1; j < nums.size(); j++) { int target2 = target3 - nums[j]; int l = j+1, r = nums.size()-1; while ( l < r) { if (target2 > (nums[l]+nums[r]) ) l++; else if (target2 < (nums[l]+nums[r]) ) r--; else { vector<int> quadruplet(4, 0); quadruplet[0] = nums[i]; quadruplet[1] = nums[j]; quadruplet[2] = nums[l]; quadruplet[3] = nums[r]; res.push_back(quadruplet); while (l < r && nums[l] == quadruplet[2]) l++; while (l < r && nums[r] == quadruplet[3]) r--; } } while(j + 1 < nums.size() && nums[j + 1] == nums[j]) j++; } while (i + 1 < nums.size() && nums[i + 1] == nums[i]) i++; } return res; }
vector<vector<int> > fourSum(vector<int> &num, int target) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. int len = num.size(); vector<vector<int>> result; if(len<4) return result; sort(num.begin(),num.end()); for(int i=0;i<len;i++) { if(i>0 && num[i]==num[i-1]) continue; // avoid duplicates for(int j=i+1;j<len;j++) { if(j>i+1 && num[j]==num[j-1]) continue; // avoid duplicates int TwoSum = num[i] + num[j]; int SumLeft = target - TwoSum; int m = j+1; int n = len-1; while(m<n) { int sum = num[m]+num[n]; if(sum == SumLeft) { vector<int> quadruplet(4); quadruplet[0] = num[i]; quadruplet[1] = num[j]; quadruplet[2] = num[m]; quadruplet[3] = num[n]; result.push_back(quadruplet); while(m<n && num[m+1]==num[m]) m++; // avoid duplicates while(m<n && num[n-1]==num[n]) n--; // avoid duplicates m++; // dont forget to increment m n--; } else if(sum<SumLeft) m++; else n--; } } } return result; }
vector<vector<int>> fourSum(vector<int>& nums, int target) { vector<vector<int>> res; if (nums.size() < 4) return res; sort(nums.begin(), nums.end()); int cur1 = nums[0]; vector<int> quadruplet(4, 0); for (int i = 0; i < nums.size() - 3; i ++) { if (cur1 == nums[i] && i != 0) continue; int cur2 = nums[i+1]; for (int j = i+1; j < nums.size() - 2; j ++) { if (cur2 == nums[j] && j != i+1) continue; int m = j + 1, n = nums.size() - 1; while (m < n) { if (nums[m] + nums[n] + nums[i] + nums[j] == target) { quadruplet[0] = nums[i]; quadruplet[1] = nums[j]; quadruplet[2] = nums[m]; quadruplet[3] = nums[n]; res.push_back(quadruplet); m ++; n --; } else if (nums[m] + nums[n] + nums[i] + nums[j] < target) m ++; else n --; } cur2 = nums[j]; } cur1 = nums[i]; } // avoid repeating auto it = unique(res.begin(), res.end()); res.resize(distance(res.begin(), it)); return res; }