单调递增的数字
这道题的思路不难, 但是处理起来很多细节: 思路就是遍历这个数, 找到不符合单调递增的情况, 把前面的数—, 同时标记个flag, 遍历完之后把flag后面的数全部改成9
细节:
- 首先要把int变成string处理, 然后由于速度的原因, 还要把string变成charArray
- 第一个遍历必须从后往前, 同时是s,length - 2, 因为是倒序, 并且判断i 和 i+1
- 如果碰到了不符合条件的, chars—, 同时标记flag= i + 1, 这里是后一个开始
- 最后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));
}
}
买卖股票的最佳时机含手续费
有一个盈利区间, 三种情况:
- 收货利润的这一天不是盈利期间的最后一天, 所以后面还要继续收获利润
- 前一天是盈利区间的最后一天, 今天要重新记录最小价格
- 不做操作, 保持原有状态
这里的情况一操作很巧妙, 定义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;
}
}
监控二叉树:
哈哈, 又回到二叉树了, 可以发现局部最优就是从叶子结点开始看, 叶子结点的父节点安装摄像头, 所用摄像头最少: 从低到上, 先给叶子结点父节点放个摄像头, 然后隔两个节点放个摄像头, 直到头结点
(既然是从低到上, 那就是左右中, 当然是后续)
状态转移: 节点有三种状态:
- 该节点无覆盖 0
- 本节点有摄像头 1
- 本节点有覆盖 2
对各种情况的处理特别多啊
单层递归情况:
- 左右节点都有覆盖, 说明此节点无覆盖, 为0
- 左右节点至少有一个无覆盖, 那么应该放摄像头, 为1
- 左右节点至少有一个摄像头, 那么有覆盖, 为2
- 以上都处理完了, 可能头结点还有个无覆盖的情况, result++