剑指 Offer II 007. 数组中和为 0 的三个数
题目描述
给定一个包含 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.基于两数之和,排序后,将第一个数变成target,然后调用两数之和的思维
2.这里有一个问题,就是可能存在多对,所以找出来三数之和之后需要进行去重
3.每次遍历 也需要去重,去掉相同的元素
代码实现
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
for(int i = 0;i<nums.length;i++) {
if(i>0&&nums[i]==nums[i-1]) continue;
int target = -nums[i];
int left = i+1,right = nums.length-1;
while(left<right) {
int sum = nums[left]+nums[right];
if(sum==target) {
List<Integer> temp = new ArrayList<>();
temp.add(nums[i]);
temp.add(nums[left]);
temp.add(nums[right]);
res.add(temp);
left++;
right--;
while(left<right&&nums[left]==nums[left-1]) left++;
while(left<right&&nums[right]==nums[right+1]) right--;
}else if(sum>target) {
right--;
}else {
left++;
}
}
}
return res;
}
}
欢迎大佬们关注小弟的博客https://blog.csdn.net/qq_41522089