4Sum

来源:互联网 发布:数据中心与云计算 编辑:程序博客网 时间:2024/06/14 21:43

题目描述

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:
Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
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)

题目解答

基于TwoSum的扩展,把4Sum问题转化为TwoSum问题即可

代码实现

public class Solution {    public List<List<Integer>> fourSum(int[] nums, int target) {        if(nums.length < 4)            return new ArrayList<>();        List<List<Integer>> ret = new ArrayList<>();        Arrays.sort(nums);        int arrLen = nums.length;        for(int i = 0; i < arrLen; i++){            for(int j = i+1; j < arrLen; j++ ){                int crossValue = target - nums[i] - nums[j];                int left = j + 1;                int right = arrLen - 1;                while(left < right){                    List<Integer> quadruple = new ArrayList<>();                    int sum = nums[left] + nums[right];                    if(crossValue == sum){                        quadruple.add(nums[i]);                        quadruple.add(nums[j]);                        quadruple.add(nums[left]);                        quadruple.add(nums[right]);                        ret.add(quadruple);                        while(left < right && nums[left] == nums[left+1])                            left++;                        while(left < right && nums[right-1] == nums[right])                            right--;                        left++;                        right--;                    }else if(crossValue > sum){                        left++;                    }else {                        right--;                    }                }                while(j < arrLen - 1 && nums[j] == nums[j+1])                    j++;            }            while(i < arrLen-1 && nums[i] == nums[i+1])                i++;        }        return ret;    }}
0 0
原创粉丝点击