每天进步一点点
算法开始第三天 三数求和 难度
medium对撞指针比hash表 简单很多
两数相加
题目描述
给你一个包含n个整数
nums判断nums中是否存在三个元素 a,b,c, 使得 a + b +c = 0 ?
请找出所有满足条件且不重复的三元组
hash表解法
求和问题 都可以 求差问题
思路分析
/**
*
* @param {number[]} nums
* 时间复杂度 O(n^ 2)
* 空间复杂度 O(n)
*/
const threeSum = function (nums) {
let result = []
let len = nums.length;
nums = nums.sort((a, b) => a - b);
for (let i = 0; i < len; i++) {
let x = nums[i]
if(i > 0 && nums[i] == nums[i -1]) continue
if (x + nums[i + 1] + nums[i + 2] > 0) break;
let map = new Map()
for(let j = i+ 1; j < len; j++){
if(j > i+ 2 && nums[j] === nums[j -1] && nums[j -1] == nums[j -2]) continue
let c = 0 - nums[i] - nums[j]
if(map.has(c)){
result.push([nums[i], nums[j],c])
map.delete(c)
}else{
map.set(nums[j],'')
}
}
}
return result
};
console.time("threeSum");
const result1 = threeSum([-1, 0, 1, 2, -1, -4]);
console.timeEnd("threeSum"); // 0.092
console.log(">>>><<<", result1); // [ [ -1, 1, 0 ], [ -1, 2, -1 ] ]
双指针
思路分析
/**
*
* @param {number[]} nums
* 时间复杂度 O(n^ 2)
* 空间复杂度 O(1)
*/
function threeSum(nums) {
let res = [] // 最坏执行次数: 1
nums = nums.sort((a, b) => {
return a - b
})// 最坏执行次数: logn
let len = nums.length // // 最坏执行次数: 1
for (let i = 0; i < len - 2; i++) { // 最坏执行次数: n - 2
let x = nums[i] // 最坏执行次数: n - 2
if (i > 0 && x === nums[i - 1]) continue // 最坏执行次数: n - 2
if (x + nums[i + 1] + nums[i + 2] > 0) break // 最坏执行次数: n - 2
if (x + nums[len -1] + nums[len - 2] < 0) continue // 最坏执行次数: n - 2
let l = i + 1 // 最坏执行次数: n - 2
let r = len - 1 // 最坏执行次数: n - 2
while (l < r) { // 最坏执行次数: n^2 - 2n
if (x + nums[l] + nums[r] < 0) {
l++
} else if (x + nums[l] + nums[r] > 0) {
r--
} else {
res.push([x, nums[l], nums[r]])
l++
while (l < r && nums[l] === nums[l - 1]) {
l++
}
r--
while (l < r && nums[r] === nums[r + 1]) {
r--
}
}
}
}
return res
}
console.time('threeSum')
const result = threeSum([-1, 0, 1, 2, -1, -4])
console.timeEnd('threeSum') // 0.141
console.log('>>>><<<', result) // [ [ -1, -1, 2 ], [ -1, 0, 1 ] ]
Baybay!!