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

总结

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

代码随想录

相关推荐
倔强的石头1069 分钟前
【C++指南】类和对象(九):内部类
开发语言·c++
鸽鸽程序猿10 分钟前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
老大白菜10 分钟前
Python 爬虫技术指南
python
Jackey_Song_Odd10 分钟前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo61713 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v19 分钟前
leetCode43.字符串相乘
java·数据结构·算法
A懿轩A1 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
古希腊掌管学习的神1 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
云边有个稻草人1 小时前
【优选算法】—复写零(双指针算法)
笔记·算法·双指针算法
机器视觉知识推荐、就业指导1 小时前
C++设计模式:享元模式 (附文字处理系统中的字符对象案例)
c++