题目:
Given an array S of n integers, are there elements a, b, c, and d in S such that a + 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)
题解:
4 sum跟3 sum是一样的思路,只不过需要多考虑一个加数,这样时间复杂度变为O(n3)。使用HashSet来解决重复问题的代码如下:
public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) { HashSet<ArrayList<Integer>> hashSet = new HashSet<ArrayList<Integer>>(); ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); Arrays.sort(num); for (int i = 0; i <= num.length-4; i++) { for (int j = i + 1; j <= num.length-3; j++) { int low = j + 1; int high = num.length - 1; while (low < high) { int sum = num[i] + num[j] + num[low] + num[high]; if (sum > target) { high--; } else if (sum < target) { low++; } else if (sum == target) { ArrayList<Integer> temp = new ArrayList<Integer>(); temp.add(num[i]); temp.add(num[j]); temp.add(num[low]); temp.add(num[high]); if (!hashSet.contains(temp)) { hashSet.add(temp); result.add(temp); } low++; high--; } } } } return result; }
使用挪动指针的方法来解决重复的代码如下:public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) { HashSet<ArrayList<Integer>> hashSet = new HashSet<ArrayList<Integer>>(); ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); Arrays.sort(num); for (int i = 0; i <= num.length-4; i++) { if(i==0||num[i]!=num[i-1]){ for (int j = i + 1; j <= num.length-3; j++) { if(j==i+1||num[j]!=num[j-1]){ int low = j + 1; int high = num.length - 1; while (low < high) { int sum = num[i] + num[j] + num[low] + num[high]; if (sum > target) { high--; } else if (sum < target) { low++; } else if (sum == target) { ArrayList<Integer> temp = new ArrayList<Integer>(); temp.add(num[i]); temp.add(num[j]); temp.add(num[low]); temp.add(num[high]); if (!hashSet.contains(temp)) { hashSet.add(temp); result.add(temp); } low++; high--; while(low<high&&num[low]==num[low-1])//remove dupicate low++; while(low<high&&num[high]==num[high+1])//remove dupicate high--; } } } } } } return result; }