LeetCode每日1题--738. 单调递增的数字

81 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情

前言

算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image-20220705103735001

刷题网站

代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!

画图软件

OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!

笔记软件

Typoral

题目

leetcode.cn/problems/mo…

image.png

解析

首先 我们要读懂题目,我们举一个例子来说明题是什么意思,如下:

例如 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));
    }
}