这道题移动指针时一定要注意防止数组索引越界,其他题目也是类似,只要移动指针,就要考虑一下数组索引会不会存在越界可能
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
int left;
int right;
for (int i = 0; i < nums.length; i++) {
//减枝
if(nums[i] > target && nums[i] >= 0){
break;
}
//对第一个数去重 ***
if(i > 0 && nums[i] == nums[i-1]){
continue;
}
for (int j = i + 1; j < nums.length; j++) {
//减枝
if(nums[i] + nums[j] > target && nums[i] + nums[j] >= 0){
break;
}
//对第二个数去重 ***
if(j > i + 1 && nums[j] == nums[j-1]){
continue;
}
left = j + 1;
right = nums.length - 1;
while (left < right){
if(nums[left] + nums[right] + nums[i] + nums[j] == target){
ArrayList<Integer> resList = new ArrayList<>();
resList.add(nums[i]);
resList.add(nums[j]);
resList.add(nums[left]);
resList.add(nums[right]);
res.add(resList);
left++;right--;
while (left < right && nums[left] == nums[left - 1]){
left++;
}
while (left < right && nums[right] == nums[right + 1]){
right--;
}
}else if(nums[left] + nums[right] + nums[i] + nums[j] > target){
right--;
}else {
left++;
}
}
}
}
return res;
}