题解
这个4sum的题其实是2sum,3sum的集大成者。其实说白了这种Ksum的题目就是只能靠遍历这种做法,枚举
所有的可能,但是这个枚举还是要点技巧,规避一些多余的计算。
Code
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
ArrayList<List<Integer>> ret = new ArrayList<>();
if( nums.length < 4) return ret;
Arrays.sort(nums);
int sum,left,right;
for(int i=0;i<nums.length-3;i++){
if( nums[i]+nums[i+1]+nums[i+2]+nums[i+3] > target ) break; // too big
if( nums[i]+nums[nums.length-3]+nums[nums.length-2]+nums[nums.length-1] < target )
continue; // too small
if( i>0 && nums[i-1]==nums[i]) continue;// remove duplicate
for(int j=i+1;j<nums.length-2;j++){ // three sum
if( nums[i]+nums[j]+nums[j+1]+nums[j+2] > target ) break;
if( nums[i]+nums[j]+nums[nums.length-2]+nums[nums.length-1] < target ) continue;
if( j>i+1 && nums[j-1]==nums[j]) continue;
left = j+1;
right = nums.length-1;
while(left < right){ // two sum
sum = nums[i]+nums[j]+nums[left]+nums[right];
if(sum > target){
right--;
}else if(sum < target){
left++;
}else{
ret.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--;}
right--;
left++;
}
}
}
}
return ret;
}
}