LeetCode每日一练【16】

Three Sum Closest

我的解法

第一次提交

介绍

如果没有在做之前的那道题目的话, 按照我的解法虽然可以正确通过, 并且内存损耗极低. 但是却有一个致命的缺点, 那就是耗时太长, 甚至需要几千毫秒才可以分析出正确结果, 这在实际运用中, 显然是不可取的. 可以参考https://www.cnblogs.com/mapodoufu/p/16215421.html

but, 幸运的是, 这道题是前面那道题目的改版, 因此凭借之前参照https://www.cnblogs.com/mapodoufu/p/16215421.html中的大神思路, 这里同样可以使用这种方法, 并且效果优秀.

思路

二和法解析

  1. 数组排序(升序): arr.sort((a, b) => a - b)

  2. 二和法 -- 三指针: arr[i] + arr[j] + arr[k] === target ?; i表示一个数组元素, j = i + 1k = arr.length - 1, 然后通过移动jk指针, 依次取得sum值, 通过sum值和target值的关系, 无限让sum === target

    1. arr[i] + arr[j] + arr[k] > target, 移动k指针
    2. arr[i] + arr[j] + arr[k] < target, 移动j指针
    3. arr[i] + arr[j] + arr[k] === target, 直接返回结果
  3. 数组去重

    1. arr[i]的去重: (i > 0 && nums[i] === nums[i - 1])?; true跳过, false执行
    2. arr[j]arr[k]的去重:
        while (nums[j] = nums[j + 1]) j++; // 去重处理
        while (nums[k] = nums[k - 1]) k--; // 去重处理
    

代码

/*
 * @Author: fox
 * @Date: 2022-05-02 11:35:34
 * @LastEditors: fox
 * @LastEditTime: 2022-05-02 16:36:14
 * @Description: https://leetcode.com/problems/3sum-closest/
 */

/**
 * @description: Runtime: 89.88%  Memory Usage: 76.62%
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
const threeSumClosest = (nums, target) => {
    let res; // 存放返回结果
    let minDiff; // 最小差值

    nums.sort((a, b) => a - b) // 数组排序

    for (let i = 0; i < nums.length - 2; i++) {
        if (i > 0 && nums[i] === nums[i - 1]) continue // 去重处理
        for (let j = i + 1, k = nums.length - 1; j < k;) {
            const sum = nums[i] + nums[j] + nums[k]; // 求和
            
            // 这是我新学的方法,用来比较两个数值是否相等很有效哦!
            if (!(sum ^ target)) { // 如果相等,证明...就不用证明了吧?直接返回吧!
                return sum
            }

            const diff = Math.abs(target - sum)            
            if (diff < minDiff || !minDiff) {
                minDiff = diff
                res = sum;
            }

            // 下面两个if语句用来无限让 sum 逼近 target
            if (sum < target) {
                j++;
                continue;
            }

            if (sum > target) {
                k--;
                continue;
            }

            while (nums[j] = nums[j + 1]) j++; // 去重处理
            while (nums[k] = nums[k - 1]) k--; // 去重处理
        }
    }

    return res;
};

let nums = [-1,2,1,-4];
let target = 1;
console.log(threeSumClosest(nums, target)) // 1

target = 1
nums = [0, 0, 0]
console.log(threeSumClosest(nums, target)) // 0

target = 0
nums = [ 1, 1, 1, 1]
console.log(threeSumClosest(nums, target)) // 3
posted @ 2022-05-02 17:02  白い故雪  阅读(17)  评论(0编辑  收藏  举报