在LeetCode评论里发现的大神的解法,非常精妙,采用的双指针,一起来看看代码
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
// 1.数组排序
// 2.使用for循环定义链表第一个元素
// 3.再用双指针进行第二第三元素的遍历
// 4.如果结果为0,添加到结果的链表里
// 5.最后返回结果
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums);
for(int i = 0; i < nums.length; i++) {
// 当nums的所有元素都大于0时,任意三数之和不可能为0
if(nums[i] > 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 {
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
// 去除与当前指向相同的元素
while (right > left && nums[left] == nums[left+1]) left++;
while (right > left && nums[right] == nums[right-1]) right--;
// 移动指针进行下一次遍历
right--;
left++;
}
}
}
return result;
}
}
可以自己去动动手,下面贴出LeetCode地址
https://leetcode-cn.com/problems/3sum/submissions/