https://leetcode-cn.com/problems/4sum/
这个和三数之和那条题目一样的思路,就是循环多一层,并且注意循环的时候,第二层循环的变量要跟着改,而不是第一层的“0”这个常量。
难搞这道题目,有空多回来回顾回顾。
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> res = new ArrayList<>();
int left;
int right;
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;
}
left = j+1;
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{
List<Integer> subList = new ArrayList<>();
subList.add(nums[i]);
subList.add(nums[j]);
subList.add(nums[left]);
subList.add(nums[right]);
res.add(subList);
while(left < right && nums[left] == nums[left+1]){
left++;//去重
}
while(left < right && nums[right] == nums[right-1]){
right--;
}
left++; right--;
}
}
}
}
return res;
}
}