【双指针】LeetCode 15. 三数之和
题目链接
思路
可以借鉴 【双指针】LeetCode 167. 两数之和 II - 输入有序数组 的思路,将 nums[i]
作为 target
,不断移动 j
和 k
来达到目标。
去重的方法:通过判断 nums[j] == nums[j + 1]
和 nums[k] == nums[k - 1]
来去重。
代码
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> result = new ArrayList<>();
for(int i = 0; i < nums.length; i++){
if(nums[i] > 0){
break;
}
if(i > 0 && nums[i] == nums[i - 1]){
continue;
}
// start from index i + 1, because (nums[1], nums[2], num[3]) == (num[2], num[1], num[3])
int j = i + 1;
int k = nums.length - 1;
while(j < k){
int sum = nums[i] + nums[j] + nums[k];
if(sum == 0){
result.add(Arrays.asList(nums[i], nums[j], nums[k]));
// deduplication
while(j < k && nums[j] == nums[j + 1]){
j++;
}
while(j < k && nums[k] == nums[k - 1]){
k--;
}
j++;
k--;
}
if(sum > 0){
k--;
}else if(sum < 0){
j++;
}
}
}
return result;
}
}