1. 程式人生 > 實用技巧 >LeetCode 18 四數之和

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;
    }
}