题目要求
解法一:
与3Sum的解法相同,需要加一层循环, 而且需要考虑[-2,-1,-1,1,1,2,2]数组里面有重复数字的可能性。
Time: O(n^3) Space: O(n)
代码:
import java.util.*;
class Program {
public static List<Integer[]> fourNumberSum(int[] array, int targetSum) {
// Write your code here.
if (array == null || array.length < 4) return new ArrayList<>();
Arrays.sort(array);
List<Integer[]> res = new ArrayList<>();
for (int i = 0; i < array.length - 2; i++) {
if (i > 0 && array[i] == array[i - 1]) continue;
for (int j = i + 1; j < array.length - 1; j++) {
if (j > i + 1 && array[j] == array[j - 1]) continue;
int leftIdx = j + 1;
int rightIdx = array.length - 1;
int sum = targetSum - array[i] - array[j];
while (leftIdx < rightIdx) {
int curSum = array[leftIdx] + array[rightIdx];
if (sum > curSum) {
leftIdx++;
} else if (sum < curSum) {
rightIdx--;
} else {
res.add(new Integer[]{array[i], array[j], array[leftIdx], array[rightIdx]});
while (leftIdx < rightIdx && array[leftIdx] == array[leftIdx + 1]) leftIdx++; // 去重
while (leftIdx < rightIdx && array[rightIdx] == array[rightIdx - 1]) rightIdx--; // 去重
leftIdx++;
rightIdx--;
}
}
}
}
return res;
}
}
解法二:
不用sort来去重
Time: O(n^2) Space: O(1)
代码: