4Sum

来源:互联网 发布:淘宝好的女装店铺推荐 编辑:程序博客网 时间:2024/05/10 11:23

Given an array S of n integers, are there elements abc, 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)

public class Solution {public static void main(String[] args) {int[] num = {-3,-2,-1,0,0,1,2,3};System.out.println(fourSum(num, 0));}    public static ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) {    Set<ArrayList<Integer>> hset = new HashSet<ArrayList<Integer>>();    ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>();        if (num == null || num.length < 4) return listAll;        Arrays.sort(num);        for (int i = 0; i < num.length - 3; i++) {            for (int j = i + 1; j < num.length - 2; j++) {                int p = j + 1;                int q = num.length - 1;                while (p < q) {                    if (num[i] + num[j] + num[p] + num[q] == target) {                        ArrayList<Integer> list = new ArrayList<Integer>();                        list.add(num[i]);                        list.add(num[j]);                        list.add(num[p]);                        list.add(num[q]);                        if (!hset.contains(list)) {                        hset.add(list);                        listAll.add(list);                        }                        p++;                        q--;                    } else if (num[i] + num[j] + num[p] + num[q] < target) {                        p++;                    } else {                        q--;                    }                }            }        }        return listAll;    }}


原创粉丝点击