(双指针)Java 求解四数之和

Posted 南淮北安

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(双指针)Java 求解四数之和相关的知识,希望对你有一定的参考价值。

一、题目

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:答案中不可以包含重复的四元组。

二、双指针分析

该题类似:三数之和

本题也是使用双指针,关键就是在三数之和基础上再套一层 for 循环,只是一些细节问题需要注意

对于三数之和,剪枝操作当 nums[i]大于0时,没必要继续计算

但是本题 target 可以为任意值,也就是可以为负值,需要几个数相加为更小

比如:-11 = (-1)+(-2)+(-3)+(-5) ,每一个都比target大,所以这样的剪枝操作不能添加

三、代码

class Solution 
    public List<List<Integer>> fourSum(int[] nums, int target) 
        List<List<Integer>> lists = new ArrayList<>();
        List<Integer> list;
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i++) 
            //题目中target是任意值,可能负的加负的更小
            //比如:target为-6,则需要 -1,-2,-3,0 相加,而这几个均大于-6
            // if(nums[i]>target)
            //     return lists;
            // 
            //去重
            if (i > 0 && nums[i] == nums[i - 1]) 
                continue;
            
            for (int j = i + 1; j < nums.length; j++) 
                //去重
                if (j > i + 1 && nums[j] == nums[j - 1]) 
                    continue;
                
                int left = j + 1;
                int right = nums.length - 1;
                while (left < right) 
                    int sum = nums[i] + nums[j] + nums[left] + nums[right];
                    if (sum > target) 
                        right--;
                     else if (sum < target) 
                        left++;
                     else 
                        list = Arrays.asList(nums[i],nums[j],nums[left],nums[right]);
                        lists.add(list);
                        while (left < right && nums[right] == nums[right - 1]) 
                            right--;
                        
                        while (left < right && nums[left] == nums[left + 1]) 
                            left++;
                        
                        left++;
                        right--;
                    
                
            
        
        return lists;
    

四、总结

三数之和的双指针是一层 for 循环nums[i]为确定值,然后循环内 left 和 right 为双指针,找到 nums[i] + nums[left] + nums[right] = 0。

四数之和的双指针解法是两层 for 循环 nums[i] + nums[j] 为确定值,依然是循环内有 left 和 right 下表作为双指针,
找出 nums[i] + nums[j] + nums[left] + nums[right] = target 的情况,三数之和的时间复杂度是 O(n^2),四数之和的时间复杂度是 O(n^3)

那么一样的道理,五数之和、六数之和等等都采用这种解法。

以上是关于(双指针)Java 求解四数之和的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 18. 四数之和

[LeetCode] 18. 四数之和 ☆☆☆(双指针)

18. 四数之和-双指针

多数之和问题

多数之和问题

(双指针)Java 求解三数之和