方法:双指针法
1.首先给数组排序,看代码你会明白为什么要排序
2.因为要四个数,双指针只有两个啊,所以固定两个数,上指针前后移动,依次遍历
代码:
public List<List<Integer>> fourSum(int[] nums, int target) {
if (nums == null || nums.length < 4)
return new ArrayList<>();
Arrays.sort(nums);
int len = nums.length;
List<List<Integer>> res = new ArrayList<>();
for (int i = 0; i < len-3 ; i++) {
if(i>0 && nums[i] == nums[i-1]) continue;
for (int j = i+1; j <len-2 ; j++) {
if(j>i+1 && nums[j] == nums[j-1]) continue;
int partSum = nums[i] + nums[j];
int left = j+1;
int right = len-1;
while (left<right){
int sum = partSum + nums[left] + nums[right];
if(sum<target){
left++;
}else if( sum>target){
right--;
}else {
res.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
//去重
while (left < right && nums[left] == nums[++left]);
while (left < right && nums[right] == nums[--right]);
}
}
}
}
return res;
}
这段代码:
while (left < right && nums[left] == nums[++left]);
while (left < right && nums[right] == nums[--right]);
与下面的一个道理,更新双指针
while (left < right) {
// 不管前后相不相等,left 都要往前走
left++;
if (nums[left - 1] != nums[left]) break;
}
while (left < right) {
// 不管前后相不相等,right 都要往后走
right--;
if (nums[right + 1] != nums[right]) break;
}
其实 这个题跟三数之和、两数之和都是一样的道理