738.单调递增的数字
文章
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)
示例 1:
输入: N = 10
输出: 9
示例 2:
输入: N = 1234
输出: 1234
示例 3:
输入: N = 332
输出: 299
说明: N 是在 [0, 10^9] 范围内的一个整数。
题解:找到不能递增的i,减1后面999.否则原数。
从前向后遍历的话,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]减一,但此时如果strNum[i - 1]减一了,可能又小于strNum[i - 2]。
这么说有点抽象,举个例子,数字:332,从前向后遍历的话,那么就把变成了329,此时2又小于了第一位的3了,真正的结果应该是299。
那么从后向前遍历,就可以重复利用上次比较得出的结果了,从后向前遍历332的数值变化为:332 -> 329 -> 299
class Solution {
public:
int monotoneIncreasingDigits(int N) {
string strNum = to_string(N);
// flag用来标记赋值9从哪里开始
// 设置为这个默认值,为了防止第二个for循环在flag没有被赋值的情况下执行
int flag = strNum.size();
for (int i = strNum.size() - 1; i > 0; i--) {
if (strNum[i - 1] > strNum[i] ) {
flag = i;
strNum[i - 1]--;
}
}
for (int i = flag; i < strNum.size(); i++) {
strNum[i] = '9';
}
return stoi(strNum);
}
};
968.监控二叉树
文章
hard题目放弃
总结
day31
455.分发饼干 :挺绕的,谁找谁谁移动
376. 摆动序列:就是找最大和最小 √
377. 最大子序和 重置
day32
122.买卖股票的最佳时机II 不要找最低点和最高点做差(代码并不好写)收集每天的正利润
378. 跳跃游戏 不用去算跳几步,关键在于可跳的覆盖范围!
45.跳跃游戏II 不要考虑怎么跳,跳几步,还是要看覆盖范围 :当前最大范围内都是加一步可到的
day33
1005.K次取反后最大化的数组和 关键在于要按绝对值排序
379. 加油站 :最大子序和
380. 分发糖果 hard 很巧妙左右两边分开考虑
day34
860.柠檬水找零 √
406.根据身高重建队列 插队
381. 用最少数量的箭引爆气球 重叠 试
day36
382. 无重叠区间:√
763.划分字母区间 :记录最后一次出现字母
56. 合并区间:修改result内
day37
738.单调递增的数字 易错
968.监控二叉树 ×
总结:有些题目,哪怕有解题思路,代码也不好写。