18. 4Sum
其实就是三数之和就多个循环,本来跑起来24MS
看了大神的题解,根据最大最小值剪枝,最后7MS
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> res=new ArrayList<>();
if(nums==null||nums.length<4){
return res;
}
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
for(int i=0;i<nums.length-3;i++){
if(i>0&&nums[i]==nums[i-1]){
continue;
}
//如果最大值还没目标大,则continue 让i变大
int max=nums[i]+nums[nums.length-1]+nums[nums.length-2]+nums[nums.length-3];
if(max<target)
continue;
//如果最小值比目标还大,就没必要继续了
int min=nums[i]+nums[i+1]+nums[i+2]+nums[i+3];
if(min>target)
break;
int t=target-nums[i];
for(int j=i+1;j<nums.length-2;j++){
if(j>i+1&&nums[j]==nums[j-1]){
continue;
}
int left=j+1,right=nums.length-1;
//同上最大值
int max1=nums[i]+nums[j]+nums[right-1]+nums[right];
if(max1<target){
continue;
}
//同上最小值
int min1=nums[i]+nums[j]+nums[j+1]+nums[j+2];
if(min1>target){
break;
}
while(left<right){
if(nums[left]+nums[right]+nums[j]==t){
List<Integer> temp=new ArrayList<>();
temp.add(nums[i]);
temp.add(nums[j]);
temp.add(nums[left]);
temp.add(nums[right]);
res.add(temp);
while(left<right&&nums[left]==nums[left+1]){
left++;
}
left++;
while(left<right&&nums[right]==nums[right-1]){
right--;
}
right--;
}
else if(nums[left]+nums[right]+nums[j]<t){
left++;
}else{
right--;
}
}
}
}
return res;
}
}