18. 4Sum

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
      
      
      List<List<Integer>> result = new ArrayList<>();
      if(4 * nums[0] > target || 4 * nums[nums.length - 1] < target) return result;
      if(nums == null || nums.length < 4) return result;
   
      
      Arrays.sort(nums);
      
      for(int i = 0; i < nums.length - 3; i++){
        if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target)break; //first candidate too large, search finished
        if(nums[i]+nums[nums.length-1]+nums[nums.length-2]+nums[nums.length-3]<target)continue;
        while( i > 0 && nums[i] == nums[i-1]) i++;
    
        for(int j = i+1; j < nums.length - 2; j++){
         if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target)break; //second candidate too large
         if(nums[i]+nums[j]+nums[nums.length-1]+nums[nums.length-2]<target)continue;
         while( j>i+1 && nums[j] == nums[j-1]) j++;
          
          int n = j+1;
          int m = nums.length - 1;
          while( n < m){
            int sum=nums[i]+nums[j]+nums[n]+nums[m];
            if(target == sum){
              result.add(Arrays.asList(nums[i], nums[j], nums[n], nums[m]));
              while(n < m && nums[n] == nums[n+1]) n++;
              while(n < m && nums[m] == nums[m-1]) m--;
              n++;
              m--;
            }else if( sum < target){
              n++;
            }else{
              m--;
            }
          }
        }
      }
      return result;
    }
}

 

Given an array nums of n integers and an integer target, are there elements abc, and d in nums 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.

Example:

Given array nums = [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]
]

4 sum 

 

https://www.youtube.com/watch?v=4wFQdfTZdzI

Use 4  pointers 

 

class Solution {

    public List<List<Integer>> fourSum(int[] nums, int target) {

      List<List<Integer>> result = new ArrayList<>();

      

      if(nums == null || nums.length < 4){

        return result;

      }

      

      Arrays.sort(nums);

      

      for(int i = 0; i < nums.length - 3; i++){

        // deduplicate

        if(i == 0 || nums[i] != nums[i-1]){

          for(int j = i + 1; j < nums.length - 2; j++){

            // deduplicate  ???? 

            if(j == i + 1 || nums[j] != nums[j-1]){

              int begin = j + 1;

              int end = nums.length - 1;

              int newTarget = target - nums[i] - nums[j];

              while(begin < end){

                if(nums[begin] + nums[end] == newTarget){

                  //result.add(new ArrayList<>(){nums[i], nums[j], nums[begin], nums[end]});////

                  result.add(Arrays.asList(nums[i], nums[j], nums[begin], nums[end]));

                  while(begin < end && nums[begin] == nums[begin + 1]){

                    begin++;

                  }

                  while(begin < end && nums[end] == nums[end - 1]){

                    end--;

                  }

                  begin++;

                  end--;

                }else if(nums[begin] + nums[end] < newTarget){

                  begin++;

                }else{

                  end--;

                }

              }

            }

          }

        }

      }

      return result;

    }

}

 

Difference between Arrays.asList(array) and new ArrayList<Integer>(Arrays.asList(array))

 

https://stackoverflow.com/questions/16748030/difference-between-arrays-aslistarray-and-new-arraylistintegerarrays-aslist

 

posted on 2018-07-18 08:31  猪猪&#128055;  阅读(104)  评论(0)    收藏  举报

导航