题目:15. 三数之和
思路:双指针。
- 首先对数组排序
- 遍历数组,设当前位置为
cur
,用两个指针left
,right
分别指向cur
的下一位、数组最后一位:
如果三个指针的数字之和为0
,则加入结果集,left
指针右移,right
指针左移,继续搜索;
如果数字之和大于0
,right
指针左移,继续搜索;
如果数字之和小于0
,left
指针右移,继续搜索。
注意判重:
- 如果当前数字与上一个数字相等,就跳过;
- 更新
left
、right
数组时,如果移动后与移动前值相等,那么就继续移动,直到遇见不重复的值。
代码:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<>();
for (int cur = 0; cur < nums.length; cur++) {
if (cur - 1 >= 0 && nums[cur] == nums[cur - 1]) {
continue;
}
int aim = 0 - nums[cur];
int left = cur + 1;
int right = nums.length - 1;
while (left < right) {
if (nums[left] + nums[right] == aim) {
res.add(new ArrayList<Integer>(Arrays.asList(nums[cur], nums[left], nums[right])));
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] > aim) {
right --;
}
else {
left ++;
}
}
}
return res;
}
}