新农上路
- 积分
- 96
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2016-10-16
- 最后登录
- 1970-1-1
|
写了下代码
- public class Four4SumFastest {
- class Pair {
- int i;
- int j;
- int sum;
- public Pair(int i, int j, int sum) {
- this.i = i;
- this.j = j;
- this.sum = sum;
- }
- }
- public List<int[]> findFourElements(int[] arr, int k) {
- List<int[]> res = new ArrayList<>();
- if (arr == null || arr.length < 4) {
- return res;
- }
- int n = arr.length;
- Arrays.sort(arr);
- List<Pair> list = new ArrayList<>();
- for (int i = 0; i < n - 1; i ++) {
- for (int j = i + 1; j < n; j++) {
- list.add(new Pair(i, j, arr[i] + arr[j]));
- }
- }
- Collections.sort(list, new Comparator<Pair>() {
- public int compare(Pair p1, Pair p2) {
- return p1.sum - p2.sum;
- }
- });
-
- int i = 0;
- int j = list.size() - 1;
- HashSet<String> set = new HashSet<>();
- while (i < j) {
- int sum = list.get(i).sum + list.get(j).sum;
- if (sum == k && nonCommon(list.get(i), list.get(j))) {
- int[] tmp = new int[4];
- tmp[0] = arr[list.get(i).i];
- tmp[1] = arr[list.get(i).j];
- tmp[2] = arr[list.get(j).i];
- tmp[3] = arr[list.get(j).j];
- Arrays.sort(tmp);
- String key = tmp[0] + " " + tmp[1] + " " + tmp[2] + " " + tmp[3];
- if (!set.contains(key)) {
- res.add(new int[] {arr[list.get(i).i], arr[list.get(i).j], arr[list.get(j).i], arr[list.get(j).j]});
- set.add(key);
- }
- i++;
- j--;
- } else if (sum > k) {
- j--;
- } else {
- i++;
- }
- }
- return res;
- }
- private boolean nonCommon(Pair p1, Pair p2) {
- if (p1.i == p2.i || p1.i == p2.j || p1.j == p2.j || p1.j == p2.i) {
- return false;
- }
- return true;
- }
- public static void main(String[] args) {
- int[] arr = {10, 2, 3, 4, 5, 9, 7, 8, 7, 8, 2, 2, 7, 7};
- Four4SumFastest f = new Four4SumFastest();
- List<int[]> res = f.findFourElements(arr, 23);
- for (int[] tmp : res) {
- String key = tmp[0] + " " + tmp[1] + " " + tmp[2] + " " + tmp[3];
- System.out.println(key);
- }
- }
- }
复制代码 |
|