开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情
前言
算法的重要性不言而喻!区分度高!
现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。
说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!
提前入门学习书籍:CPrimerPlus、大话数据结构
刷题网站
我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以
刷题嘛,最重要的就是坚持了!!!
画图软件
OneNote
这个要经常用,遇见不懂的流程的话就拿它画一画!
笔记软件
Typoral
题目
解析
首先 我们要读懂题目,我们举一个例子来说明题是什么意思,如下:
例如 87,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是79,即小于87的最大的单调递增整数。
没错,题目就是这个意思!我们把题目看明白了后面的就好做了!
局部最优:一旦出现strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]--,然后strNum[i]给为9,这样就可以保证这两位变成最大单调递增的整数
全局最优:得到小于等于N的最大单调递增的整数
但是我们还需要确定遍历的顺序,是正着遍历还是倒着遍历呢?
这里应该使用倒着遍历,我们还是举例子说明:
数字:332,从前向后遍历的话,那么就把变成了329,此时2又小于了第一位的3了,真正的结果应该是299。
所以从前后向遍历会改变已经遍历过的结果!
那么从后向前遍历,就可以重复利用上次比较得出的结果了,从后向前遍历332的数值变化为:332 -> 329 -> 299
是不是非常的amazing呢?
倒着遍历的for循环应该这样写:
for (int i = s.length() - 2; i >= 0; i--) {}有了遍历,剩下的就是比较了呗
当遇见strNum[i - 1] > strNum[i]的时候就让strNum[i - 1]所代表的数减1,让strNum[i]代表的数变为9
因为是倒着遍历,我们要拿strNum[i]和strNum[i+1]去比较
int start = s.length();是用来标记赋值9从哪里开始
完整代码
看不懂?没办法,多写多练多总结!
还是带入代码到示例中多去总结多练习!
class Solution {
public int monotoneIncreasingDigits(int n) {
String s = String.valueOf(n);
char[] chars = s.toCharArray();
int start = s.length();
for (int i = s.length() - 2; i >= 0; i--) {
if (chars[i] > chars[i + 1]) {
chars[i]--;
start = i+1;
}
}
for (int i = start; i < s.length(); i++) {
chars[i] = '9';
}
return Integer.parseInt(String.valueOf(chars));
}
}