算法D37 | 贪心算法6 | 738.单调递增的数字 968.监控二叉树

738.单调递增的数字

代码随想录

Python:

尝试了下写成非string修改的,会复杂一点。

python 复制代码
class Solution:
    def monotoneIncreasingDigits(self, n: int) -> int:
        str_num = list(str(n))
        for i in range(len(str_num)-1, 0, -1):
            if str_num[i-1] > str_num[i]:
                str_num[i-1] = str(int(str_num[i-1]) - 1)
                for j in range(i, len(str_num)):
                    str_num[j] = '9'
        result = 0
        for s in str_num:
            result = result*10 + int(s)
        return result

C++:

优化了一下,第一遍先更新flag指针;第二遍更新后续的9,比python版本稍优。

cpp 复制代码
class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        string strNum = to_string(n);
        int flag = strNum.size();
        for (int i=strNum.size()-1; i>0; i--) {
            if (strNum[i-1] > strNum[i]) {
                flag = i;
                strNum[i-1]--;
            }
        }
        for (int i=flag; i<strNum.size(); i++) {
            strNum[i] = '9';
        }
        return stoi(strNum);
    }
};

968.监控二叉树 (可以跳过)

本题是贪心和二叉树的一个结合,比较难,一刷大家就跳过吧。

代码随想录

Python:

思路还是比较直接的,动手画一画,需要耐心把不同情况梳理清楚。关键思路是把状态(0, 1, 2)分清楚。

python 复制代码
class Solution:
    def __init__(self):
        self.result = 0

    def traversal(self, cur):
        # 后序遍历
        # 终止条件:空节点,该节点有覆盖
        if not cur: return 2
        left = self.traversal(cur.left)
        right = self.traversal(cur.right)
        # 1. 左右节点都有覆盖
        if left == 2 and right == 2: return 0
        # 2. 左右节点至少有一个无覆盖
        if left == 0 or right == 0:
            self.result += 1
            return 1
        # 3. 左右节点至少有一个有摄像头
        if left == 1 or right == 1: return 2

    def minCameraCover(self, root: Optional[TreeNode]) -> int:
        # 0:本节点无覆盖 1:本节点有摄像头 2:本节点有覆盖
        if self.traversal(root) == 0:
            self.result += 1
        return self.result

C++:

cpp 复制代码
class Solution {
public:
    int result = 0;
    int traversal(TreeNode* cur) {
        // 后序遍历
        // 终止条件:空节点,该节点有覆盖
        if (cur==NULL) return 2;
        int left = traversal(cur->left);
        int right = traversal(cur->right);
        // 1. 左右节点都有覆盖
        if (left==2 && right==2) return 0;
        // 2. 左右节点至少有一个无覆盖
        if (left==0 || right==0) {
            result++;
            return 1;
        }
        // 3. 左右节点至少有一个有摄像头
        if (left==1 || right==1) return 2;
        return -1; // we shall never get here
    }
    int minCameraCover(TreeNode* root) {
        // 0:本节点无覆盖 1:本节点有摄像头 2:本节点有覆盖
        if (traversal(root)==0) {
            result++;
        }
        return result;
    }
};

总结

可以看看贪心算法的总结,贪心本来就没啥规律,能写出个总结篇真的不容易了。

代码随想录

相关推荐
yszaygr21387 分钟前
Verilog参数化游程编码RLE模块
算法
望易19 分钟前
刚设计的大模型架构-双域耦合认知框架
算法·架构
复杂网络4 小时前
多个 Claude Code 与多个 Codex 协同工作:设计与实现方案
算法
你好潘先生4 小时前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师5 小时前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码5 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
copyer_xyf5 小时前
FastAPI 如何连接 MySQL
后端·python
apocelipes18 小时前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
HjhIron20 小时前
面试常客:字符串算法从入门到进阶
算法·面试
用户83562907805120 小时前
使用 Python 在 PDF 中创建与管理书签
后端·python