代码随想录算法训练营第第37天 | 56. 合并区间 、738.单调递增的数字、968.监控二叉树

  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

posted @ 2024-06-13 23:38  YuanYF6  阅读(2)  评论(0编辑  收藏  举报