1

题目详情

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.

输入一个长度为n的整数数组和一个目标整数target,我们需要找出是否存在4个元素a、b、c、d,使得abcd的和等于target。如果有,输出这样的非重复的元素序列。

For example, 输入数组S = [1, 0, -1, 0, -2, 2], 目标整数target = 0.
返回的结果集是:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]

想法

  • 本题的思路还是基于3Sum问题延伸出来的。
  • 减治思想,如果通过遍历,每次锁定一个元素作为a元素,然后剩下的问题就变成了求三个数的和是否等于target,依次类推。
  • 在求cd元素的时候可以通过左右指针减少查找时间。

解法

    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        int length = nums.length;
        if(length<4 || target > nums[length-1]*4 || target < nums[0]*4)return res;
        
        for(int i=0;i<length-3;i++){
            if(i == 0 || (i>0 && nums[i] != nums[i-1])){
                for(int j=i+1;j<length-2;j++){
                    if((j == i+1 || nums[j] != nums[j-1])){
                        int tempTarget = target-nums[i]-nums[j];
                        int low = j+1;
                        int high = length-1;
                        while(low < high){
                            if(nums[low]+nums[high] == tempTarget){
                                res.add(Arrays.asList(nums[i],nums[j],nums[low],nums[high]));
                                while(low < high && nums[low] == nums[low+1])low++;
                                while(low < high && nums[high] == nums[high-1])high--;
                                low++;
                                high--;
                            }else if(nums[low] + nums[high] > tempTarget){
                                high--;
                            }else{
                                low++;
                            }
                        }
                    }
                }
                
            }
        }
        return res;
    }

soleil阿璐
350 声望45 粉丝

stay real ~