代码随想录算法训练营day37

文章讨论了解决单调递增数字转换问题的高效算法,通过字符串操作降低时间复杂度,并介绍了贪心策略在监控二叉树问题中的应用,强调通过模拟和找出局部最优来判断是否为贪心算法。
摘要由CSDN通过智能技术生成

题目:738.单调递增的数字、968.监控二叉树

参考链接:代码随想录

738.单调递增的数字

思路:首先想到的是暴力解法,即判断一个数字是不是单调递增,方法即为求出每一位依次比较,对于给定的n,从n–开始往下考虑,直到获得答案,时间复杂度O(n*m),m为长度,结果超时。然后对于贪心想法,首先是一个数字,如果两位已经不满足单调递增,比如98,即num[i-1]>num[i],这时候先将num[i-1]–,然后将num[i]记为9,即变为89。然后是思考怎么遍历,如果从前往后,num[i-1]会减一,这时候又可能小于num[i-2],比如322,从左往右遍历329,因为十位减一后小于了百位,故需要从后往前遍历,这样可以确保每个前一位比上一位小。注意在这个过程中,一旦又一个数字被赋值成了9,则它后面的数字全部要改为9,我们需要使用一个参数flag记录后面都要赋值为9的位置。时间复杂度O(m),m为长度。

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        string num=to_string(n);
        int flag=num.size();//一开始flag记为末尾,即不需要置9
        for(int i=num.size()-1;i>0;i--){
            if(num[i-1]>num[i]){
                flag=i;//这里需要被置9,记录位置
                num[i-1]--;
            }
        }
        //从后往前遍历完一轮后,flag后全部都要置9
        for(int i=flag;i<num.size();i++){
            num[i]='9';
        }
        return stoi(num);
    }
};

代码实现上的一个关键就是使用字符串来操作,如果使用数组,最后转换的时候还要一位位的加。这里需要牢记字符串和int的相互转换函数。

968.监控二叉树

太难pass

贪心总结

判断贪心的方法:如果找出局部最优并可以推出全局最优,就是贪心,如果局部最优都没找出来,就不是贪心,可能是单纯的模拟。
做题过程:不用数学证明,只需要手动模拟,举不出反例,就是贪心,面试时能够跑出代码就OK。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值