LeetCode 738 单调递增的数字
题目链接:https://leetcode.cn/problems/monotone-increasing-digits/
思路:
例如:98,一旦出现strNum[0] > strNum[1]的情况(非单调递增),首先想让strNum[0]--,然后strNum[1]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。
从前遍历还是从后遍历?
从前向后遍历的话,遇到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 s = to_string(n);
int flag = s.size(); // 记录将第flag位后的数全部赋为9,不取0是为了防止1234被赋成9999
for(int i = s.size()-1;i>0;i--) // 因为判断条件中有i-1,所以i要大于0
{
if(s[i-1]>s[i])
{
s[i-1]--;
flag = i;
}
}
for(int i = flag;i<s.size();i++)
{
s[i] = '9';
}
return stoi(s);
}
};
总结
再接再厉。
LeetCode 968 监控二叉树
题目链接:https://leetcode.cn/problems/binary-tree-cameras/
思路:
代码:
总结
二刷再看。
今日总结:
贪心算法总算结束了。