// 二数求和
/*给定nums = [2,7,11,15,8,3,5,4,1,6,4,0,-2,-1,-4,-7,-6,-3], 找出二个元素 a,b 的所有组合, 使得 a+b =9.
eg. [[2,7],[8,1],[3,6],[4,5],[11,-2],[15,-6]]
*/
const main = () => {
const nums = [2, 7, 11, 15, 8, 3, 5, 4, 1, 5, 5, 4, 6, 4, 0, -2, -1, -4, -7, -6, -3];
const sum = 9;
const result1 = twoSum1(nums, sum); // 空间换时间法
const result2 = twoSum2(nums, sum); // 双指针对撞法
console.log('result1: ', result1, '\nresult2: ', result2);
}
// 空间换时间法
const twoSum1 = (nums, sum) => {
nums = nums.filter((val, id, self) => id === self.lastIndexOf(val));
// console.log(nums);
const result = [];
const obj = {};
for (var i = 0, len = nums.length; i < len; i++) {
if (obj[nums[i]] !== undefined ) {
result.push([nums[i], obj[nums[i]]]);
} else {
obj[sum - nums[i]] = nums[i];
}
}
return result;
}
// 双指针对撞法
const twoSum2 = (nums, sum) => {
nums = nums.sort((a, b) => a - b).filter((val, id, self)=> id === self.lastIndexOf(val));
// console.log(nums);
const result = [];
let i = 0;
let j = nums.length - 1;
while (i < j) {
if (nums[i] + nums[j] < sum) {
i++;
} else if (nums[i] + nums[j] > sum) {
j--;
} else { // nums[i]+ nums[j] === sum
result.push([nums[i], nums[j]]);
i++;
j--;
}
}
return result;
}
main();// 三数求和
/*
给定nums = [-1,0,1,2,-1,-4], 找出三个元素 a,b,c 的所有组合, 使得 a+b+c =0.
eg. [[-1,0,1], [-1,-1,2]]
*/
const main = () => {
const nums = [-1, 0, 1, 2, -1, -4];
const sum = 0;
const result = threeSum(nums, sum); // 双指针对撞法
console.log(result);
}
const threeSum = (nums, sum) => {
// 不能给数组去重复,不然最后get 不到 [ -1, -1, 2 ]
// nums = nums.sort((a, b) => a > b).filter((val, id, self) => id === self.lastIndexOf(val));
nums.sort((a, b) => a > b);
let temp;
let result = [];
for (var i = 0, len = nums.length; i < len; i++) {
let j = i + 1;
let k = len - 1;
// 如果是重复元素,skip 掉
while (i > 0 && nums[i] === nums[i - 1]) {
i++;
}
while (j < k) {
temp = nums[i] + nums[j] + nums[k];
console.log(temp, nums[i] + nums[j] + nums[k], '|', nums[i], nums[j], nums[k]);
if (temp === sum) {
result.push([nums[i], nums[j++], nums[k--]]);
// 如果是重复元素,skip 掉
while (j < k && nums[j] === nums[j - 1]) {
j++;
}
// 如果是重复元素,skip 掉
while (j < k && nums[k] === nums[k + 1]) {
k--;
}
} else if (temp < sum) {
j++;
// 如果是重复元素,skip 掉
while (j < k && nums[j] === nums[j - 1]) {
j++;
}
} else if (temp > sum) {
k--;
// 如果是重复元素,skip 掉
while (j < k && nums[k] === nums[k + 1]) {
k--;
}
}
}
}
return result;
}
main();P.S. 只是自己做下练习,算法非原创
生活太艰难,学多一点总没坏