题目链接:leetcode-cn.com/problems/3s…
题目描述
给你一个包含 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 = []
输出:[]
- 提示:
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
解题
最优解法:先排序,再利用双指针移动法,时间复杂度 o(n)
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
// 对数组进行排序
let arrSOrt = nums.sort((a,b) => a - b);
// 结果数组
let result = [];
for (let i = 0; i<nums.length; i++) {
// 去重
if (i > 0 && arrSOrt[i] === arrSOrt [i - 1])
continue;
let left = i + 1;
let right = nums.length - 1;
while(left < right) {
let sum = arrSOrt[i] + arrSOrt[left] + arrSOrt[right];
if (sum === 0) {
result.push([arrSOrt[i], arrSOrt[left], arrSOrt[right]]);
// 去重
while(left < right && arrSOrt[left] === arrSOrt[left+1]) left++;
while(left < right && arrSOrt[right] === arrSOrt[right - 1]) right--;
left++;
right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return result;
};
总结
该题目容易忽略去重,一次性写对还是有点挑战。
算法修炼github:github.com/mengmengzp/…