题目链接
https://leetcode.cn/problems/3sum/
题解
class Solution {
// 双指针法
public List<List<Integer>> threeSum(int[] nums) {
// 取数组长度
int len = nums.length;
// 要返回的结果
List<List<Integer>> list = new ArrayList<>();
// 排序数组
Arrays.sort(nums);
// 从小到大把每一个元素当基准,直到基准元素大于0
int i = 0;
while (i < len && nums[i] <= 0) {
// 创建双指针,左指针指向基准元素后一位,右指针指向最后一位
int lp = i + 1;
int rp = len - 1;
// 左右指针循环寻找
while (lp < rp) {
if (nums[i] + nums[lp] + nums[rp] < 0) {
// 如果基准元素和左右指针指向元素的和小于0,则将左指针右移使结果变大
lp++;
} else if (nums[i] + nums[lp] + nums[rp] > 0) {
// 如果基准元素和左右指针指向元素的和小于0,则将右指针左移使结果变小
rp--;
} else {
// 如果相等则记录这三个值,然后左指针右移,右指针左移
list.add(Arrays.asList(nums[i], nums[lp], nums[rp]));
lp++;
rp--;
// 特殊处理:如果左指针右移之后的数字和右移之前的数字相同则直接跳过,继续右移(去重)
while (lp < rp && nums[lp-1] == nums[lp]) {
lp++;
}
// 特殊处理:如果右指针左移之后的数字和左移之前的数字相同则直接跳过,继续左移(去重)
while (lp < rp && nums[rp+1] == nums[rp]) {
rp--;
}
}
}
i++;
// 特殊处理:如果基准元素右移后下一个元素与上一个相同,则跳过继续向右移动
while (i < len && nums[i-1] == nums[i]) {
i++;
}
}
return list;
}
}