Given an arraySOfNIntegers, are there elementsA,B,C, AndDInSSuch thatA+B+C+D= Target? Find all unique quadruplets in the array which gives the sum of target.
Note:
- Elements in a quadruplet (A,B,C,D) Must be in Non-descending order. (ie,A≤B≤C≤D)
- The solution set must not contain duplicate quadruplets.
For example, given array S = {1 0-1 0-2 2}, and target = 0.
A solution set is:
(-1, 0, 0, 1)
(-2,-1, 1, 2)
(-2, 0, 0, 2)
Solution:
public class Solution {public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) {Arrays.sort(num); HashSet<ArrayList<Integer>> hashSet = new HashSet<ArrayList<Integer>>();ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); for (int i = 0; i < num.length; i++) {for (int j = i + 1; j < num.length; j++) {int k = j + 1;int l = num.length - 1; while (k < l) {int sum = num[i] + num[j] + num[k] + num[l]; if (sum > target) {l--;} else if (sum < target) {k++;} else if (sum == target) {ArrayList<Integer> temp = new ArrayList<Integer>();temp.add(num[i]);temp.add(num[j]);temp.add(num[k]);temp.add(num[l]); if (!hashSet.contains(temp)) {hashSet.add(temp);result.add(temp);} k++;l--;}}}} return result;}}
C ++
class Solution {public: vector<vector<int> > fourSum(vector<int> &num, int target) { // Note: The Solution object is instantiated only once and is reused by each test case. vector<int> tmp; vector<vector<int>> res; if(num.empty()) return res; sort(num.begin(), num.end()); for(int i=0; i<num.size(); i++) { int cur = target - num[i]; for(int j=i+1; j<num.size(); j++) { int temp = cur - num[j]; int start = j+1, end = num.size()-1; while(start<end) { if(num[start]+num[end]==temp) { tmp.push_back(num[i]); tmp.push_back(num[j]); tmp.push_back(num[start]); tmp.push_back(num[end]); res.push_back(tmp); tmp.clear(); start++; end--; while(start<end&&num[start]==num[start-1]) start++; while(start<end&&num[end]==num[end+1]) end--; } else if(num[start]+num[end]<temp) { start++; while(start<end&&num[start]==num[start-1]) start++; } else { end--; while(start<end&&num[end]==num[end+1]) end--; } } while(j<num.size()&&num[j]==num[j+1]) j++; } while(i<num.size()&&num[i]==num[i+1]) i++; } return res; }};
Leetcode: 4Sum