1.问题描述
2.解决办法
排序+双指针
- 排序后,如果第一个数都大于0;则后面的之和一定大于0
- 保证当前数和前一个的数不一样,避免重复
- for 循环每一个数 左右指针分别指向i+1和数组最后一个数
- 判断三个指针指向是否等于0,如果不等于,大于0则右指针向左移,小于0则左指针向右移
- 如果是(18. 四数之和)就套一层for ,i,j 分别指向第一个第二个数,左指针指向j+1;
3.代码实现
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) {
//排序后,如果第一个数都大于0;则后面的之和一定大于0
return result;
}
if (i > 0 && nums[i] == nums[i - 1]) {
//保证当前数和前一个的数不一样,避免重复
continue;
}
int left = i + 1;
int right = nums.length - 1;
while (right > left) {
int sum = nums[i] + nums[left] + nums[right];
if (sum > 0) {
right--;
} else if (sum < 0) {
left++;
} else {
//当前sum==0;则添加到list中
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
//左右指针当前数不能和之前数相同,避免重复
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
right--;
left++;
}
}
}
return result;
}
}