[代码随想录]Day32-贪心算法part06

题目:738. 单调递增的数字

思路:

从前往后找的话,如果改了一个数,那么对这个数之前的判断就不一定会成立了(eg.110)
从后往前找的话,会不断更新前面的数,后面的数因为都改成9了不需要再担心其他问题。

代码:

func monotoneIncreasingDigits(n int) int {
    s := strconv.Itoa(n)
    ss := []byte(s)
    lens := len(ss)
    if lens <= 1 {
        return n
    }
    for i := lens-1; i > 0; i-- { // 从后向前找
        if ss[i-1] > ss[i] {   // 遇到不是递增
            ss[i-1] -= 1 // 前面的数-1
            for j := i; j < lens; j++ { // 后面数全改为9   
                ss[j] = '9'
            }
        } 
    }
    res, _ := strconv.Atoi(string(ss))
    return res 
}

参考:

代码随想录

题目:968. 监控二叉树

思路:

所以我们要从下往上看,局部最优:让叶子节点的父节点安摄像头,所用摄像头最少,整体最优:全部摄像头数量所用最少!
在二叉树中如何从低向上推导呢?可以使用后序遍历也就是左右中的顺序,这样就可以在回溯的过程中从下到上进行推导了。
详情看参考

代码:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
var res int
func minCameraCover(root *TreeNode) int {
    res = 0
    if dfs(root) == 0 {
        res++
    }
    return res
}
func dfs(root *TreeNode) int {
    if root == nil {
        return 2
    }
    left := dfs(root.Left) // 左
    right := dfs(root.Right) // 右
    if left == 2 && right == 2 { // 都被覆盖了不管了
        return 0
    }else if left == 0 || right == 0 { // 有没有被覆盖的子节点,覆盖!
        res++
        return 1
    }else { // 否则已经覆盖了
        return 2
    }
}

参考:

代码随想录

posted @   WtcSky  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示