题目:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:
输入:nums = []
输出:[]
示例 3:
输入:nums = [0]
输出:[]
提示:
- 0 <= nums.length <= 3000
- -105 <= nums[i] <= 105
简单描述一下这个题目的思路:
1. 先对数组进行排序 [-1,0,1,2,-1,-4] -> [-4,-1,-1,0,1,2]
2. 遍历数组,定住一个数 a,在 a 的后面再利用双指针找另外两个数 b c
3. 结束条件就是当 a > 0,毕竟 a 都大于0,后面的数肯定也大于 0
4. 注意:在遍历的过程中记得去重,跳过重复的
代码如下:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
// 数组元素数少于 3,不符合
if(nums.length < 3) return result;
// 数组元素排序
Arrays.sort(nums);
for(int i = 0; i < nums.length; i++){
// 当前值大于 0,后面不可能找到三个数的值大于 0的情况了
if(nums[i] > 0) return result;
// 去重
if(i > 0 && nums[i] == nums[i - 1]) continue;
// 双指针
int start = i + 1, end = nums.length - 1;
int sum;
while(start < end){
// 求和
sum = nums[i] + nums[start] + nums[end];
if(sum > 0){
end--;
} else if(sum < 0){
start++;
} else {
// 记录三数和为 0 情况的各个值
result.add(Arrays.asList(nums[i], nums[start], nums[end]));
// 去重
while(start < end && nums[end-1] == nums[end--]) {}
while(start < end && nums[start+1] == nums[start++]) {}
}
}
}
return result;
}
}