美文网首页
[Leetcode]18. 4Sum

[Leetcode]18. 4Sum

作者: 炭烧熊猫 | 来源:发表于2019-05-28 09:51 被阅读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

    相关文章

      网友评论

          本文标题:[Leetcode]18. 4Sum

          本文链接:https://www.haomeiwen.com/subject/ncqrtctx.html