比较知名的网站建设公司,搜索引擎找不到的网站,wordpress oop,邢台做网站推广找谁738.单调递增的数字
思路#xff1a;
题目要求小于等于N的最大单调递增的整数#xff0c;那么拿一个两位的数字来举例。
例如#xff1a;98#xff0c;一旦出现strNum[i - 1] strNum[i]的情况#xff08;非单调递增#xff09;#xff0c;首先想让strNum[i - 1]…738.单调递增的数字
思路
题目要求小于等于N的最大单调递增的整数那么拿一个两位的数字来举例。
例如98一旦出现strNum[i - 1] strNum[i]的情况非单调递增首先想让strNum[i - 1]--然后strNum[i]给为9这样这个整数就是89即小于98的最大的单调递增整数。
从后向前遍历就可以重复利用上次比较得出的结果了从后向前遍历332的数值变化为332 - 329 - 299
确定了遍历顺序之后那么此时局部最优就可以推出全局找不出反例试试贪心
代码
//手撕
class Solution {
public:int monotoneIncreasingDigits(int n) {string strnum to_string(n);int flag strnum.size();for(int i strnum.size()-1; i0; i--){if(strnum[i-1]strnum[i]){flag i;strnum[i-1]--;}}for(int i flag; istrnum.size(); i){strnum[i] 9;}return stoi(strnum);}
};//卡哥代码
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);}
};
时间复杂度O(n)n 为数字长度空间复杂度O(n)需要一个字符串转化为字符串操作更方便 23.监控二叉树二刷补