LeetCode 18 四數之和
阿新 • • 發佈:2020-10-05
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; } }