4sum

与3sum思路一样,先将数组排序。然后依次遍历,将问题转化为3sum,再转化为2sum。最终问题得到解决。

注意2sum函数的参数,要包含第一个add到list里的数。

public List<List<Integer>> fourSum(int[] num, int target) {
        List<List<Integer>> lists = new ArrayList<List<Integer>>();
        int len=num.length,i=0,j=0;
        if(len<4){
          return lists;  
        }
        Arrays.sort(num);
        int temp=num[0]+1;
        for(i=0;i<len-3;i++){
            if(temp!=num[i]){
                threeSum(num,i+1,target-num[i],lists);
                temp=num[i];
            }
        }
        return lists;
    }
    
    public void threeSum(int[] num,int start,int target,List<List<Integer>> lists) {
        int len=num.length;
        int temp=num[start]+1;
        for(int i=start;i<len-2;i++){
           if(temp!=num[i]){
               twoSum(num,start-1,i+1,target-num[i],lists);
               temp=num[i];
           }
        }
    }
    
    public void twoSum(int[] num,int first,int start,int target,List<List<Integer>> lists) {
        int len=num.length;
        int low =start,high=len-1,t,lv,rv,lt=num[low]+1,rt=num[high]+1;
        List<Integer> list = new ArrayList<Integer>();
        while(low<high){
            lv=num[low];
            rv=num[high];          
            t=lv+rv;
            if(t==target){
            	if(!(lv==lt && rv==rt)){
	                list = new ArrayList<Integer>();
	                list.add(num[first]);
	                list.add(num[start-1]);
	                list.add(lv);
	                list.add(rv);
	                lists.add(list);
	                lt=lv;
	                rt=rv;
            	}
            	low++;
	        high--;
            }else if(t>target){
                high--;
            }else{
                low++;
            }            
        }
    }


你可能感兴趣的:(4sum)