class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
if(nums.length<4)return new ArrayList<>();
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){
if(nums[i]+nums[j]+nums[left]+nums[right]>target)right--;
else if(nums[i]+nums[j]+nums[left]+nums[right]<target)left++;
else{
res.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
while(left<right && nums[left] == nums[left+1])left++;
while(left<right && nums[right] == nums[right-1])right--;
left++;
right--;
}
}
}
}
return res;
}
}
利用双指针,将原有o^4降至o^3
这道题的难点是去重
如果和前面的数相同就跳过,第一个数字不跳过