刷题11.17

1 单调递增的整数

题目

当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。
给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。

代码

class Solution {
    public int monotoneIncreasingDigits(int n) {
        String s=String.valueOf(n);
        char[] chars=s.toCharArray();
        int flag=s.length();
        for(int i=chars.length-2;i>=0;i--){
            if(chars[i]>chars[i+1]){
                chars[i]--;
                flag=i+1;
            }
        }
        for(int i=flag;i<chars.length;i++)
            chars[i]='9';
        return Integer.parseInt(String.valueOf(chars));
    }
}

总结

看到题目,能想到的也是暴力解法。
看了讲解代码,也不理解为何要设置9标记。自己直接将chars[i+1]改为9,果然出错了。测试用例100,只能找到90,顿时明白了为何要9标志。而且9后面为了保持递增,一定是9.

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

题目

给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。
你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。
返回获得利润的最大值。
注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

代码

class Solution {
    public int maxProfit(int[] prices, int fee) {
        int min = prices[0];
        int sum = 0;
        for (int p : prices) {
            if (p < min) {
                min=p;
            } else if (p > min+fee){
                sum += p - min-fee;
                min=p-fee;
            }
        }
        return sum;
    }
}

总结

还是懵懵的(⊙o⊙)…
利润不是一次算清楚的,而是连续算的。

*3 监控二叉树

题目

给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量

代码

class Solution {
    int res=0;
    public int minCameraCover(TreeNode root) {
        if(traver(root)==0)
            res++;
        return res;
    }
    public int traver(TreeNode root){
        //0:无覆盖 1:有摄像头 2:有覆盖
        if(root==null) return 2;
        int left=traver(root.left);
        int right=traver(root.right);
        if(left==2 && right==2) return 0;
        else if (left == 0 || right == 0) {
            res++;
            return 1;
        } else return 2;
    }
}

总结

一开始真的想不到,只会觉得这道题好麻烦,还要考虑数。
但是看了讲解代码,理解起来感觉还是很流畅的。
从下往上看,局部最优:让叶子节点的父节点安摄像头,所用摄像头最少,整体最优:全部摄像头数量所用最少!
真的是想不到啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值