[Leetcode]18. 4Sum

2019-05-28  本文已影响0人  炭烧熊猫

一个人没有梦想,和咸鱼有什么分别。 -- 喜剧之王

这道题是3sum的衍生题,解题思路相似,基本没有了之前那个题的难度,不过还是要注意,四个数去重的问题。

题目

难度 中等

Given an array nums of n integers and an integer target, are there elements a, b, c, 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]
]

解释: 给定一个数据和一个目标整数, 寻找所有相加之和是目标整数的a, b, c, d 四数数组。

基本解题思路和15题相似,数组排序,前两个数字需要循环,后面两个数字继续采用双指针的原则查找。 注意去重的代码。

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        
        List<List<Integer>> quadruplets = new ArrayList();
        //数据排序,记得是Arrays.sort
        Arrays.sort(nums);
        
        int first = 0;
        
        for(int i = first; i < nums.length - 3; i++){
                        
            int numOne = nums[i];
            
            // 去掉第一个数字的重复条件
            if (i > 0 && numOne == nums[i - 1]) continue;
            
            for(int j = i+1; j < nums.length - 2; j++ ){
                
                int numTwo = nums[j]; 
                
                //去掉第二个数字的重复条件
                if (j > 1 && j -1 > i && numTwo == nums[j - 1]) continue;
                
                int targetNum = target - numOne - numTwo;
                
                int beg = j + 1;
                int end = nums.length - 1;
            
                while (beg < end){                    
                    if(beg< end && (nums[beg] + nums[end])>targetNum) end--;
                    if(beg< end && (nums[beg] + nums[end])<targetNum) beg++;
                
                    if(beg< end && nums[beg] + nums[end] == targetNum){
                        
                        // 去掉第三个和四个数字的重复排序
                        while(beg< end && nums[beg] == nums[beg + 1]) beg++;
                        while(beg< end && nums[end] == nums[end - 1]) end--;
                    
                        int numThree = nums[beg];
                        int numFour = nums[end];
                    
                    
                        List<Integer> numsList = new ArrayList();
                    
                        numsList.add(numOne);
                        numsList.add(numTwo);
                        numsList.add(numThree);
                        numsList.add(numFour);
                        
                        quadruplets.add(numsList);                        
                        
                        end--;
                        beg++;
                                                
                }
                    
                
            }
                
            }
            
        }
        
        return quadruplets;
    }
}

时间复杂度应该是O(n^3)

image.png
上一篇下一篇

猜你喜欢

热点阅读