算法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;
    }
};

总结

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

代码随想录

相关推荐
山上三树3 小时前
详细介绍 C 语言中的 #define 宏定义
c语言·开发语言·算法
_Rookie._3 小时前
关于迭代协议:可迭代协议和迭代器协议,生成器函数 生成器对象的理解
javascript·python
农夫山泉2号3 小时前
【rk3588】——在rk3588上,用python进行qwen3-vl模型推理
python·flask·rk3588·qwen3-vl
DYS_房东的猫3 小时前
写出第一个程序
c++
ulias2123 小时前
AVL树的实现
开发语言·数据结构·c++·windows
黎雁·泠崖3 小时前
二叉树知识体系全梳理:从基础到进阶一站式通关
c语言·数据结构·leetcode
山上三树3 小时前
详细介绍 C/C++ 中的内存泄漏
c语言·c++
AI科技星3 小时前
引力与电磁的动力学耦合:变化磁场产生引力场与电场方程的第一性原理推导、验证与统一性意义
服务器·人工智能·科技·线性代数·算法·机器学习·生活
96773 小时前
python基础自学
开发语言·windows·python
毕设源码-朱学姐3 小时前
【开题答辩全过程】以 基于Python的茶语店饮品管理系统的设计与实现为例,包含答辩的问题和答案
开发语言·python