18. 4Sum

    /*
     * 18. 4Sum
     * 2016-4-15 by Mingyang
     * 这个题目跟3sum一样的去重方法,不用HashSet,因为太慢,注意这个题目是4个的和为target,不为0
     * 然后这里把判重条件改了一下,改为了 if(i>0&&nums[i]==nums[i-1])  continue;
     * 这么更言简意赅,同理,if(j>i+1&&nums[j]==nums[j-1])也是跳过
     */
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> res=new ArrayList<List<Integer>>();
        int len=nums.length;
        if(nums==null||len==0)
          return res;
        Arrays.sort(nums);
        for(int i=0;i<len;i++){
            if(i==0||nums[i]!=nums[i-1]){
                for(int j=i+1;j<len;j++){
                    if(j==i+1||nums[j]!=nums[j-1]){
                        int low=j+1;
                        int high=len-1;
                        while(low<high){
                            int sum=nums[low]+nums[high]+nums[i]+nums[j];
                            if(sum==target){
                                List<Integer> list=new ArrayList<Integer>();
                                list.add(nums[i]);
                                list.add(nums[j]);
                                list.add(nums[low]);
                                list.add(nums[high]);
                                res.add(list);
                                while(low<high&&nums[low]==nums[low+1]) low++;
                                while(low<high&&nums[high]==nums[high-1]) high--;
                                low++;
                                high--;
                            }else if(sum<target){
                               low++;
                           }else{
                               high--;
                           }
                        }
                    }
                }
            }
        }
        return res;
    }
原文地址:https://www.cnblogs.com/zmyvszk/p/5397980.html