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

总结

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

代码随想录

相关推荐
宸津-代码粉碎机2 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
Y3815326622 小时前
SERP API 计费口径:credits_charged、执行失败扣费与退款边界
python·搜索引擎
chenbingjie_c3 小时前
C++ 进阶核心知识点总结:模板、内存分区、new/delete、内存池
开发语言·c++
专注仿真3 小时前
ACM算法
算法·深度优先
蒸鱼Yuzheng4 小时前
设备端性能工件可靠导出:断点续传、哈希、manifest 与失败恢复
android·自动化测试·python·adb·数据完整性
code斗4 小时前
Java数据结构:堆详解
java·开发语言·数据结构
Frank_refuel5 小时前
【C++】Json库介绍和使用
c++
重生之小比特5 小时前
【C++进阶】map和set
java·开发语言·c++
圆圆讲门店5 小时前
挑选同城获客服务机构时需要考量的核心因素都有哪些?
大数据·网络·人工智能·python
傻啦嘿哟5 小时前
Python的默认参数把我坑惨了,原来写[]和写None的区别这么大
开发语言·python·机器学习