只能说这题绝妙,亦或是我解法较笨
class Solution {
public List<List<Integer>> fourSum(int[] nums,int target) {
List<List<Integer>> ans=new ArrayList<>();
int size=nums.length;
if(size<4)
return ans;
Arrays.sort(nums);
for(int i=0;i<nums.length-3;i++)
{
int flag1=nums[i];
if(i>0&&nums[i]==nums[i-1])continue;
//if(flag1>target)return ans;
for(int j=i+1;j<nums.length-2;j++)
{
int flag2=nums[j];
if(j>i+1&&nums[j]==nums[j-1])continue;
///if(flag1+flag2>target)break;
int l=j+1;
int r=nums.length-1;
while(l<r){
int temp=flag1+flag2+nums[l]+nums[r];
if(temp==target){
ans.add(Arrays.asList(flag1,flag2,nums[l],nums[r]));
while(l<r&&nums[l]==nums[l+1])
l++;
while(l<r&&nums[r]==nums[r-1])
r--;
l++;
r--;
}
else if(temp>target)
r--;
else
l++;
}
}
}
return ans;
}
}
这中间每一次错误都是一个巨坑
今早走在路上又想到一点优化方法,时间减少1/3
class Solution {
public List<List<Integer>> fourSum(int[] nums,int target) {
List<List<Integer>> ans=new ArrayList<>();
int size=nums.length;
if(size<4)
return ans;
Arrays.sort(nums);
for(int i=0;i<nums.length-3;i++)
{
int flag1=nums[i];
if(i>0&&nums[i]==nums[i-1])continue;
if(flag1>target/4)return ans;
for(int j=i+1;j<nums.length-2;j++)
{
int flag2=nums[j];
if(j>i+1&&nums[j]==nums[j-1])continue;
//if(flag1+flag2>target)break;
//上面是仿照3数之和写的,错误,因为那个0是0/2和0/3
if(flag1+flag2>target/2)break;
//排序后两数大于目标一半,后面再加两一定大于目标
int l=j+1;
int r=nums.length-1;
while(l<r){
if(flag1+flag2+nums[l]>3*target/4)break;
int temp=flag1+flag2+nums[l]+nums[r];
if(temp==target){
ans.add(Arrays.asList(flag1,flag2,nums[l],nums[r]));
while(l<r&&nums[l]==nums[l+1])
l++;
while(l<r&&nums[r]==nums[r-1])
r--;
l++;
r--;
}
else if(temp>target)
r--;
else
l++;
}
}
}
return ans;
}
}