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