18. 4Sum

来源:互联网 发布:乔丹和詹姆斯数据对比 编辑:程序博客网 时间:2024/06/11 21:05

Given an array S of n integers, are there elements a, b, c, 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]
]
代码解析:通过3Sum作为铺垫,在3sum中题目要求三个数相加为0, 4sum就可以理解为三个数相加为target-nums[k]只需要加一层循环去遍历这个数组即可,同样要做去重复这一步

public class Solution {    public static void main(String[] args) {        // TODO Auto-generated method stub        int[] nums = {-3,-2,-1,0,0,1,2,3};        System.out.println(fourSum(nums, 0));    }     public static List<List<Integer>> fourSum(int[] nums,int target) {              List<List<Integer>> sumList = new ArrayList<List<Integer>>();              if(nums.length < 4)                  return sumList;              Arrays.sort(nums);              for(int k = 0;k<nums.length;k++){                  if (k == 0 || nums[k] > nums[k - 1]) {            for(int i=k+1; i<nums.length-2; i++) {                  if (i == 1 || nums[i] >= nums[i - 1]) {                  int start = i+1;                  int end = nums.length-1;                  while(start<end) {                      if(nums[i]+nums[start]+nums[end] == target-nums[k]) {                          ArrayList<Integer> tempList = new ArrayList<Integer>();                         tempList.add(nums[k]);                        tempList.add(nums[i]);                          tempList.add(nums[start]);                          tempList.add(nums[end]);                         if(!sumList.contains(tempList))                        sumList.add(tempList);                          start++;                          end--;                          //去掉重复的数据                          while((start<end) && (nums[end]==nums[end+1]))                              end--;                          while((start<end) && (nums[start]==nums[start-1]))                              start++;                      } else if(nums[i]+nums[start]+nums[end] > target-nums[k]) {                          end--;                      } else {                          start++;                      }                  }              }              }                 }            }            return sumList;          }  }
0 0