leetcode 738.单调递增的数字
问题描述
当且仅当每个相邻位数上的数字 x
和 y
满足 x <= y
时,我们称这个整数是单调递增的。
给定一个整数 n
,返回 小于或等于 n
的最大数字,且数字呈 单调递增 。
示例 1:
输入: n = 10
输出: 9
示例 2:
输入: n = 1234
输出: 1234
示例 3:
输入: n = 332
输出: 299
提示:
0 <= n <= 10^9
核心思路
核心思路
记 表示数字 从高到低的第 位的数字( 从 开始)。
-
如果整个数字 本身已经是按位单调递增的,那么最大的数字即为 。
-
如果找到第一个位置 使得 的数位单调递增且 ,此时 的数位都与 的对应数位相等,仍然被 限制着,即我们不能随意填写 位置上的数字。为了得到最大的数字,我们需要解除 的限制,来让剩余的低位全部变成 ,即能得到小于 的最大整数。而从贪心的角度考虑,我们需要尽量让高位与 的对应数位相等,故尝试让 自身数位减 。此时已经不再受 的限制,直接将 的位置上的数全部变为 即可。
实现要点
当 自身数位减 后可能会使得 和 不再满足递增的关系,因此我们需要从 开始递减比较相邻数位的关系,直到找到第一个位置 使得 自身数位减 后 和 仍然保持递增关系,或者位置 已经到最左边(即 的值为 ),此时我们将 的数全部变为 才能得到最终正确的答案。
code
1 | class Solution { |
-
时间复杂度:,其中 表示数字 的位数。我们遍历 的时间即能构造出满足条件的数字。
-
空间复杂度:。我们需要 的空间存放数字 每一位的数字大小。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小狐狸的被窝!
评论
WalineValine