JavaScript:leetcode_16. 最接近的三數之和(排序+雙指針)

題目說明

給定一個包括 n 個整數的數組 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。

 

示例:

輸入:nums = [-1,2,1,-4], target = 1
輸出:2
解釋:與 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
 

提示:

3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4

首先這個題可以使用3重for循環來遍歷求值,並記錄最接近target的值,但是會超時。

解題思路一

  1. 對數組進行從小到大排列
  2. 結果由三個數構成,我們提取出第一個數字nums[i], 剩下的值就是target-nums[i],我們需要在剩餘數組元素中找到兩個值nums[pb],nums[pc],最接近target-nums[i]
  3. 由於三個元素不可重複,所以我們首先遍歷nums,然後在每次遍歷中,設定pb的初始值爲 i + 1pc的初始值爲nums.length - 1
  4. 當前我們所求的當前值爲target_close_help = nums[i] + nums[pb] + nums[pc];,另外用target_close記錄最接近target的值。
  5. 每次遍歷,nums[i]是確定的。所以只需要判斷target_close_help 是否大於 target,如果大於pc--,否則pb++;若target_close_help等於target則直接返回。
    1. 由於nums小到大排列,所以pc--代表nums[pc]的值會變小target_close_help的值也會變,這樣纔會慢慢接近target,反之亦然pb++是同樣的道理。
  6. 最後判讀target_close_help 是否更接近target,若更接近則用target_close記錄該次target_close_help
  7. 若沒有相等於target的情況出現,最後則返回target_close的值。

代碼實現一

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var threeSumClosest = function(nums, target) {
    nums = nums.sort((a,b) => {
        return a-b;
    })
    let target_close = 100001;
    for (let i = 0; i < nums.length; i++) {
        let pb = i + 1;
        let pc = nums.length - 1;
        while(pc > pb) {
            let target_close_help = nums[i] + nums[pb] + nums[pc];
            if (target_close_help < target) {
                pb++;
            } else if (target_close_help > target) {
                pc--;
            } else {
                return target;
            }
            if (Math.abs(target_close_help - target) < Math.abs(target_close - target)) {
                target_close = target_close_help;
            }
        }
    }
    return target_close;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章