2126、摧毀小行星 | 演算法(leetode,附思維導圖 + 全部解法)300題

碼農三少發表於2022-01-30

零 標題:演算法(leetode,附思維導圖 + 全部解法)300題之(2126)摧毀小行星

一 題目描述

題目描述
題目描述

二 解法總覽(思維導圖)

思維導圖

三 全部解法

1 方案1

1)程式碼:

// 方案1 “排序、模擬法(本質:貪心法)”。
// 技巧:“類似打怪升級,優先打敗小怪物、升級,後面再去挑戰血量更厚的怪物!”。

// 思路:
// 1)狀態初始化,resBool = true 。
// 2)核心1:對 asteroids 進行升序排序。
// 3)核心2:遍歷 asteroids ,根據情況分別去更新 mass、resBool 值。
// 3.1)若  mass >= asteroids[i] (說明行星 能摧毀該小行星),
// 則 mass += asteroids[i] (獲得該小行星的質量)。
// 3.2)若  mass < asteroids[i] (說明行星 不能摧毀該小行星),
// 則 resBool = false 並 跳出迴圈 。
// 4)返回結果 resBool 。
var asteroidsDestroyed = function(mass, asteroids) {
    // 1)狀態初始化,resBool = true 。
    const l = asteroids.length;
    let resBool = true;

    // 2)核心1:對 asteroids 進行升序排序。
    asteroids = asteroids.sort((a, b) => a - b);
    
    // 3)核心2:遍歷 asteroids ,根據情況分別去更新 mass、resBool 值。
    for (let i = 0; i < l; i++) {
        // 3.1)若  mass >= asteroids[i] (說明行星 能摧毀該小行星),
        // 則 mass += asteroids[i] (獲得該小行星的質量)。
        if (mass >= asteroids[i]) {
            mass += asteroids[i];
        }
        // 3.2)若  mass < asteroids[i] (說明行星 不能摧毀該小行星),
        // 則 resBool = false 並 跳出迴圈 。
        else {
            resBool = false;
            break;
        }
    }

    // 4)返回結果 resBool 。
    return resBool;
};

2 方案2

1)程式碼:

// 方案2 “一行程式碼 - 裝X法”。
// 技巧:通過 陣列的sort方法,對 asteroids 進行升序排序(“體現貪心”);
// 通過 陣列的reduce(n個元素 變成 1個元素,優先考慮使用 reduce )方法,不斷遍歷每個小行星(從小到大)、不斷更新 acc 和 mass值。
var asteroidsDestroyed = function(mass, asteroids) {
    return asteroids.sort((a, b) => a - b).reduce(
        (acc, cur) => (acc) && (mass >= cur ? (mass += cur) : (0)),
        true
    );
}

相關文章