给定一个包含 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/1fGaJU
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
是双指针的变形,我们知道双指针法的时间复杂度就是 On 那么,三指针就是在一个指针固定的前提下,移动另外两个指针,时间复杂度是 On2,此题并没有明确数组是排好序的,所以,先排序,时间复杂度是 onlogn + O n2,结果还是 n2,思路如下:
当数组长度大于 3 的时候,先排序,然后从 0 - nums.length - 2 的这个区间范围内固定指针,然后另外俩指针在后面搜,注意,本题的难点其实是去重问题,如果出现相同的数字,那么如果不做处理,得到的结果就会有重复的情况,所以,每次固定 i 指针的时候,需要先判断下一个元素是否等于 i,如果还等于,再往后固定。
同理,定义 j 指针的时候以同样的方法来。
class Solution {
List> result = new linkedList>();
public List> threeSum(int[] nums) {
if (nums.length >= 3) {
Arrays.sort(nums);
int i = 0;
while (i < nums.length - 2) {
twoSum(nums, i);
int temp = nums[i];
while (i < nums.length && temp == nums[i]) {
i++;
}
}
}
return result;
}
private void twoSum(int[] nums, int i) {
int j = i + 1;
int k = nums.length - 1;
while (j < k) {
int sum = nums[i] + nums[j] + nums[k];
if (sum == 0) {
result.add(Arrays.asList(nums[i], nums[j], nums[k]));
int temp = nums[j];
while (j < k && nums[j] == temp) {
j++;
}
} else if (sum > 0) {
k--;
} else {
j++;
}
}
}
}



