题目
给你一个包含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
解法
思路: 先排序,然后固定一个元素,寻找后面两个元素。具体细节查看代码中注释。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if(nums == null || nums.length < 3){
return res;
}
// 排序
Arrays.sort(nums);
for(int i = 0 ; i < nums.length - 2 ; i++){
// 如果第一个数大于0,后面的数都比它大,肯定不成立了
if(nums[i] > 0){
break;
}
// 去掉重复情况
if(i != 0 && nums[i] == nums[i-1]){
continue;
}
int target = -nums[i];
int left = i + 1 , right = nums.length - 1;
while(left < right){
if(nums[left] + nums[right] == target){
res.add(new ArrayList<>(Arrays.asList(nums[i],nums[left],nums[right])));
// 现在要增加 left,减小 right,但是不能重复
left++;
right--;
// 判断left后面的元素是否和前面的元素重复
while(left < right && nums[left] == nums[left - 1]){
left++;
}
// 判断right前面的元素是否和后面的元素重复
while(left < right && nums[right] == nums[right+1]){
right--;
}
} else if (nums[left] + nums[right] < target){
left++;
} else {
right--;
}
}
}
return res;
}
}
总结
本篇文章讲解了算法题目的思路和解法,代码和笔记由于纯手打,难免会有纰漏,如果发现错误的地方,请第一时间告诉我,这将是我进步的一个很重要的环节。以后会定期更新算法题目以及各种开发知识点,如果您觉得写得不错,不妨点个关注,谢谢。