LeetCode 18 四数之和

LeetCode 18 四数之和

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

  • 答案中不可以包含重复的四元组。

排序+双指针

执行用时:12 ms, 在所有 Java 提交中击败了65.92%的用户
内存消耗:39.1 MB, 在所有 Java 提交中击败了76.75%的用户

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        /*边界值*/
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        if(nums.length<4) return res;
        /*借助三数之和加一重循环*/
        Arrays.sort(nums); /*排序*/
        for(int i=0;i<nums.length-2;i++){
            int j = i+1;
             /*快速判断条件,减少运行时间*/
            if(nums[i]+3*nums[j]>target) break;
            for(;j<nums.length-1;j++){
                int Target = -(nums[i]+nums[j]) + target;
                int k=j+1,m=nums.length-1;
                while(k<m){
                    if((nums[k]+nums[m])==Target){
                        List<Integer> curr = new ArrayList<Integer>();
                        curr.add(nums[i]);curr.add(nums[j]);
                        curr.add(nums[k]);curr.add(nums[m]);
                        res.add(curr);
                        k++;m--;
                        /*p3,p4指针去重*/
                        while(k<nums.length && nums[k-1]==nums[k]) k++;
                        while(m>j && nums[m]==nums[m+1]) m--;
                    }
                    else if((nums[k]+nums[m])>Target) m--;
                    else k++;
                }
                /*p2指针去重*/
                while(j<nums.length-1 && nums[j]==nums[j+1]) j++;
            }
            /*p1指针去重*/
            while(i<nums.length-3 && nums[i]==nums[i+1]) i++; 
        }
        return res;
    }
}
posted @ 2020-10-05 15:43  CodeSPA  阅读(75)  评论(0编辑  收藏  举报