<js>Two sum & Three sum

203 阅读2分钟

// 二数求和
/*给定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. 只是自己做下练习,算法非原创

生活太艰难,学多一点总没坏