代码随想录训练营day37, 单调递增的数字, 股票交易带手续费, 监控二叉树

单调递增的数字

这道题的思路不难, 但是处理起来很多细节: 思路就是遍历这个数, 找到不符合单调递增的情况, 把前面的数—, 同时标记个flag, 遍历完之后把flag后面的数全部改成9

细节:

  1. 首先要把int变成string处理, 然后由于速度的原因, 还要把string变成charArray
  2. 第一个遍历必须从后往前, 同时是s,length - 2, 因为是倒序, 并且判断i 和 i+1
  3. 如果碰到了不符合条件的, chars—, 同时标记flag= i + 1, 这里是后一个开始
  4. 最后return要变回parseInt, 同时需要valueOf的值单调递增的数字
class Solution {
    public int monotoneIncreasingDigits(int n) {
        //先把数字变成一个字符串, 然后在变成charArray
        String s = String.valueOf(n);
        char[] chars = s.toCharArray();
        //定义一个flag, 找到哪个位置会变成9
        int flag = Integer.MAX_VALUE;
        //开始遍历, 找到从哪里开始不符合单调递增
        for(int i = s.length() - 2; i >= 0; i--){
            if(chars[i + 1] < chars[i]){
                //标记flag, 同时把数字减一
                flag = i + 1;
                chars[i]--;
            }
        }

        //第二次遍历改为9
        for(int i = flag; i < s.length(); i++){
            chars[i] = '9';
        }
        //最后再返回个int
        return Integer.parseInt(String.valueOf(chars));
    }
}

买卖股票的最佳时机含手续费

有一个盈利区间, 三种情况:

  1. 收货利润的这一天不是盈利期间的最后一天, 所以后面还要继续收获利润
  2. 前一天是盈利区间的最后一天, 今天要重新记录最小价格
  3. 不做操作, 保持原有状态

这里的情况一操作很巧妙, 定义buy = prices[i], 所以如果第二天股价继续上升的话, 那么就变成prices[i + 1] - prices[i], 股价连续上升, 那么res利润也会连续上升

class Solution {
    public int maxProfit(int[] prices, int fee) {
        //定义最低买入价
        int buy = prices[0] + fee;
        int res = 0;
        int len = prices.length;
        for(int i = 0; i < len; i++){
            //如果价格低于最低买入价, 就买
            //比忘了把fee给包括
            if(prices[i] + fee < buy){
                buy = prices[i] + fee;
            } else if (prices[i] > buy){
                //如果此时的价格打入买入价, 就卖掉
                //但是可能不是股价最高点, 所以提供返回操作
                res += prices[i] - buy;
                //情况一
                buy = prices[i];
            }
        }
        return res;
    }
}

监控二叉树:

哈哈, 又回到二叉树了, 可以发现局部最优就是从叶子结点开始看, 叶子结点的父节点安装摄像头, 所用摄像头最少: 从低到上, 先给叶子结点父节点放个摄像头, 然后隔两个节点放个摄像头, 直到头结点

(既然是从低到上, 那就是左右中, 当然是后续)

状态转移: 节点有三种状态:

  1. 该节点无覆盖 0
  2. 本节点有摄像头 1
  3. 本节点有覆盖 2

对各种情况的处理特别多啊

单层递归情况:

  1. 左右节点都有覆盖, 说明此节点无覆盖, 为0
  2. 左右节点至少有一个无覆盖, 那么应该放摄像头, 为1
  3. 左右节点至少有一个摄像头, 那么有覆盖, 为2
  4. 以上都处理完了, 可能头结点还有个无覆盖的情况, result++
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值