这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战
题目
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c , 使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意: 答案中不可以包含重复的三元组。
示例
输入: nums = [-1,0,1,2,-1,-4]
输出: [[-1,-1,2],[-1,0,1]]
输入: nums = []
输出: []
输入: nums = [0]
输出: []
提示
0 <= nums.length <= 3000-10^5 <= nums[i] <= 10^5
解题思路
排序 + 双指针
要寻找数组中三个相加为0的元素,我们可以先对数组进行排序,利用其有序性,便于我们采用双指针对解法来求得结果。
解题步骤如下:
- 对数组进行排序;
- 定义a,b,c三个指针;
- 固定其中一个指针,剩余两个指针采用双指针解法来搜索答案;
- 保存结果。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
int n = nums.length;
// 边界判断,长度小于3直接返回
if(n < 3){
return list;
}
// 数组排序
Arrays.sort(nums);
// 遍历a指针,在后续对元素中找到b,c相加为0
for(int a = 0; a < n - 2; ++a){
// 题目要求不能包含重复的三元组,这里需要做个去重判断
if(a > 0 && nums[a] == nums[a - 1]){
continue;
}
// b,c指针分别对于首尾两个方向
int b = a + 1, c = n - 1;
// 终止条件
while(b < c){
// 去重判断,前面对左边做了去重判断,这里要对右边做去重判断
if(c < n - 1 && nums[c] == nums[c + 1]){
--c;
// 找到目标值,将其加入结果集
}else if(nums[b] + nums[c] == -nums[a]){
List<Integer> tmp = new ArrayList();
tmp.add(nums[a]);
tmp.add(nums[b]);
tmp.add(nums[c]);
list.add(tmp);
--c;
// 大于0则右边指针左移
}else if(nums[b] + nums[c] > -nums[a]){
--c;
// 小于0则左边指针右移
}else{
++b;
}
}
}
// 返回结果
return list;
}
}
复杂度分析
- 时间复杂度:
- 空间复杂度:
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!