18-4Sum
题目详情
解题思路
代码实现
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> result=new ArrayList<>();
if(nums== null || nums.length<4){
return result;
}
Arrays.sort(nums);
//最外层循环
for(int i=0;i+4<=nums.length;i++){
if(i-1>-1 && nums[i-1]==nums[i]){
continue;
}
//进行剪枝优化
if((nums[i]+3*nums[nums.length-1])<target){
continue;
}
if((nums[i]+3*nums[i+1])>target){
break;
}
getThreeSum(target-nums[i],nums,i+1,nums[i],result);
}
return result;
}
//在nums中从begin开始,找到三数之和为target的组合
private void getThreeSum(int target,int[] nums,int begin,int curNum,List<List<Integer>> result){
if(begin+3>nums.length){
return;
}
int left=0;
int right=0;
int curTarget=0;
for(int i=begin;i+3<=nums.length;i++){
if(i-1>=begin && nums[i-1]== nums[i]){
continue;
}
curTarget=target-nums[i];
left=i+1;
right=nums.length-1;
while(left<right){
//指定指针移动的规则
if(nums[left]+nums[right]<curTarget){
left++;
}
else if(nums[left]+nums[right]>curTarget){
right--;
}
//可以放入结果了
else{
if(left-1>i && nums[left-1]== nums[left]){
left++;
continue;
}
else if(right+1<nums.length&& nums[right]==nums[right+1]){
right--;
continue;
}
else{
result.add(Arrays.asList(new Integer[]{curNum,nums[i],nums[left],nums[right]}));
left++;
right--;
}
}
}
}
}
}课后总结
Last updated