0双指针中等 LeetCode18. 四数之和

18. 四数之和

描述

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] :
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。

分析

双指针的优势,将一个O(n^2)的问题转变成O(n)的问题。
本题是在三数之和的基础上,多了一层外循环,最里面还是双指针,将原本是O(n^4)的问题降低成O(n^3)的问题。

class Solution {
    
    
    public List<List<Integer>> fourSum(int[] nums, int target) {
    
    
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        for(int i = 0; i < nums.length; i++){
    
    
            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){
    
    
                        left++;
                    }
                    if(sum > target){
    
    
                        right--;
                    }
                    if(sum == target){
    
    
                        List<Integer> li = new ArrayList<>();
                        li.add(nums[i]);
                        li.add(nums[j]);
                        li.add(nums[left]);
                        li.add(nums[right]);
                        res.add(li);
                        left++;
                        right--;
                        while(left < right && nums[left] == nums[left-1]){
    
    
                            left++;
                        }
                        while(left < right && nums[right] == nums[right+1]){
    
    
                            right--;
                        }
                    }
                }
            }
        }
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43260719/article/details/120835912
今日推荐