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