这题我用O(N*N*N)时间复杂度做的,不知道是不是最优的。
用indexMap保存了各值的坐标,在查找第四个值时方便。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class L4Sum {
public static void main(String[] args) {
int[] num = new int[6];
num[0] = 1;
num[1] = 0;
num[2] = -1;
num[3] = 0;
num[4] = -2;
num[5] = 2;
L4Sum s = new L4Sum();
ArrayList<ArrayList<Integer>> ss = s.fourSum(num, 0);
System.out.println(ss);
}
public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
Arrays.sort(num);
Map<Integer, Integer> indexMap = new HashMap<Integer, Integer>();
for (int i = num.length - 1; i >= 0; i--) {
indexMap.put(num[i], i);
}
for (int i = 0; i < num.length; i++) {
if (i - 1 >= 0 && num[i] == num[i - 1]) {
continue;
}
int startJ = i + 1;
for (int j = i + 1; j < num.length; j++) {
if (num[j] == num[j - 1] && j - 1 >= startJ) {
continue;
}
int startK = j + 1;
for (int k = j + 1; k < num.length; k++) {
if (num[k] == num[k - 1] && k - 1 >= startK) {
continue;
}
int s = num[i] + num[j] + num[k];
int t = target - s;
Integer index = indexMap.get(t);
if (index != null) {
if (index <= k) {
index = k + 1;
}
if (index < num.length && num[index] == t) {
ArrayList<Integer> list = new ArrayList<Integer>(4);
list.add(num[i]);
list.add(num[j]);
list.add(num[k]);
list.add(t);
result.add(list);
}
}
}
}
}
return result;
}
}