题目描述:
输入输出Demo:
解析:在LeetCode上本题属于Medium难度。TwoSum的升级版,不是很难,采用双指针,先排序,首先定一个数,其余的数就用两个指针逼近。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<>();
for (int i = 0; i < nums.length - 2; i++) {
int l = i + 1, r = nums.length - 1;
if (i > 0 && nums[i] == nums[i - 1]) { //防止固定到相同的数,即,遇到相同的数就跳过
continue;
}
while (l < r) {
if (nums[i] + nums[l] + nums[r] > 0) { //表明r的数大了
r--;
} else if (nums[i] + nums[l] + nums[r] < 0) { //表明l的数小了
l++;
} else {
//满足条件
List<Integer> currRes = new ArrayList<>();
currRes.add(nums[i]);
currRes.add(nums[l]);
currRes.add(nums[r]);
res.add(currRes);
//去重
while (l < r && nums[l] == nums[l + 1]) { //双指针逼近过程中也要去重
l++;
}
while (l < r && nums[r] == nums[r - 1]) {
r--;
}
l++;
r--;
}
}
}
return res;
}
}