程式碼隨想錄演算法訓練營第第37天 | 56. 合併區間 、738.單調遞增的數字、968.監控二叉樹

YuanYF6發表於2024-06-13
  1. 合併區間
    本題也是重疊區間問題,如果昨天三道都吸收的話,本題就容易理解了。
    https://programmercarl.com/0056.合併區間.html
能做出來
/**
 * @param {number[][]} intervals
 * @return {number[][]}
 */
var merge = function(intervals) {
    intervals.sort((a, b)=>{
        if (a[0] !== b[0]) {
            return a[0] - b[0];
        } else {
            return a[1] - b[1];
        }
    });
    const res = [intervals[0]];
    for (let i=1; i<intervals.length;i++) {
        if (intervals[i][0]<=res[res.length-1][1]) {
            res[res.length-1][1] = Math.max(intervals[i][1], res[res.length-1][1]);
        } else {
            res.push(intervals[i]);
        }
    }
    return res;
};

738.單調遞增的數字
https://programmercarl.com/0738.單調遞增的數字.html

沒思路
利用字串前放+號進行隱式轉換
 n = n.toString()
    n = n.split('').map(item => {
        return +item
    })
    let flag = Infinity
    for(let i = n.length - 1; i > 0; i--) {
        if(n [i - 1] > n[i]) {
            flag = i
            n[i - 1] = n[i - 1] - 1
            n[i] = 9
        }
    }

    for (let i = flag; i< n.length;i++) {
        n[i] = 9
    }

    n = n.join('')
    return +n

968.監控二叉樹 (可跳過)

本題是貪心和二叉樹的一個結合,比較難,一刷大家就跳過吧。
https://programmercarl.com/0968.監控二叉樹.html

太難,看影片題解理解了
注意三個if的順序不能調換
var minCameraCover = function(root) {
    let result = 0
    function traversal(cur) {
        if(cur === null) {
            return 2
        }

        let left = traversal(cur.left)
        let right = traversal(cur.right)

        if(left === 2 && right === 2) {
            return 0
        }

        if(left === 0 || right === 0) {
            result++
            return 1
        }

        if(left === 1 || right === 1) {
            return 2
        }

        return -1
    }

    if(traversal(root) === 0) {
        result++
    }

    return result

};

總結
可以看看貪心演算法的總結,貪心本來就沒啥規律,能寫出個總結篇真的不容易了。
https://programmercarl.com/貪心演算法總結篇.html

相關文章