LeetCode日记 15. 三数之和
程序员文章站
2022-07-15 11:19:33
...
题目来自:https://leetcode-cn.com/problems/3sum/
参考题解区写出来的代码:
package code;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class solution {
public List<List<Integer>> threeSum(int[] nums) {
//数组为空,或者长度小于3,直接放回一个空集合
if (nums == null || nums.length < 3) {
return new ArrayList<>();
}
//先对数组排序
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList();
for (int i = 0; i < nums.length - 2; i++) {
int first = nums[i];
//如果第一个数都大于0,那就没必要接着找了,直接跳出循环
if (first > 0) {
break;
}
if (i > 0 && nums[i] == nums[i - 1]) {
continue; // 去重
}
//左右指针
int left = i + 1, right = nums.length - 1;
while (left < right) {
//计算三数之和
int sum = first + nums[left] + nums[right];
//如果sum=0
if (sum == 0) {
//对相同的结果进行去重!
while (left < right && nums[left] == nums[left + 1]) left++;//去重
while (left < right && nums[right] == nums[right - 1]) right--;//去重
//加入结果集合
ArrayList<Integer> list = new ArrayList();
list.add(first);
list.add(nums[left]);
list.add(nums[right]);
res.add(list);
//左右指针夹逼
left++;
right--;
} else if (sum < 0) {
//sum<0,说明小了,左指针向右走
left++;
} else {
//sum》0,说明大了,右指针向左走
right--;
}
}
}
return res;
}
}