4Sum:带重复数组取值求和

来源:互联网 发布:三国之数据辅助103 编辑:程序博客网 时间:2024/05/22 12:59

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: 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]]
思路:由于有重复不能dfs遍历,所以得排序,比3sum多一重循环。代码参考:https://leetcode.com/problems/4sum/discuss/

public class Solution {public List<List<Integer>> fourSum(int[] num, int target) {    ArrayList<List<Integer>> ans = new ArrayList<>();    if(num.length<4)return ans;    Arrays.sort(num);    for(int i=0; i<num.length-3; i++){        if(num[i]+num[i+1]+num[i+2]+num[i+3]>target)break; //first candidate too large, search finished        if(num[i]+num[num.length-1]+num[num.length-2]+num[num.length-3]<target)continue; //first candidate too small        if(i>0&&num[i]==num[i-1])continue; //prevents duplicate result in ans list        for(int j=i+1; j<num.length-2; j++){            if(num[i]+num[j]+num[j+1]+num[j+2]>target)break; //second candidate too large            if(num[i]+num[j]+num[num.length-1]+num[num.length-2]<target)continue; //second candidate too small            if(j>i+1&&num[j]==num[j-1])continue; //prevents duplicate results in ans list            int low=j+1, high=num.length-1;            while(low<high){                int sum=num[i]+num[j]+num[low]+num[high];                if(sum==target){                    ans.add(Arrays.asList(num[i], num[j], num[low], num[high]));                    while(low<high&&num[low]==num[low+1])low++; //skipping over duplicate on low                    while(low<high&&num[high]==num[high-1])high--; //skipping over duplicate on high                    low++;                     high--;                }                //move window                else if(sum<target)low++;                 else high--;            }        }    }    return ans;}