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

总结

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

代码随想录

相关推荐
WG_172 分钟前
第五章.图论
算法·图论
Pacify_The_North6 分钟前
【C++进阶三】vector深度剖析(迭代器失效和深浅拷贝)
开发语言·c++·windows·visualstudio
神里流~霜灭12 分钟前
蓝桥备赛指南(12)· 省赛(构造or枚举)
c语言·数据结构·c++·算法·枚举·蓝桥·构造
跳跳糖炒酸奶16 分钟前
第四章、Isaacsim在GUI中构建机器人(1): 添加简单对象
人工智能·python·ubuntu·机器人
扫地的小何尚17 分钟前
NVIDIA工业设施数字孪生中的机器人模拟
android·java·c++·链表·语言模型·机器人·gpu
小杨爱学习zb19 分钟前
学习总结 网格划分+瞬态求解设置
笔记·学习·算法
Zfox_19 分钟前
【C++项目】从零实现RPC框架「四」:业务层实现与项目使用
linux·开发语言·c++·rpc·项目
我想吃余23 分钟前
【C++篇】类与对象(上篇):从面向过程到面向对象的跨越
开发语言·c++
Niuguangshuo26 分钟前
Python设计模式:克隆模式
java·开发语言·python
双叶83633 分钟前
(C语言)单链表(1.0)(单链表教程)(数据结构,指针)
c语言·开发语言·数据结构·算法·游戏