给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。

(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)

示例 1:

输入: N = 10
输出: 9

示例 2:

输入: N = 1234
输出: 1234

示例 3:

输入: N = 332
输出: 299

说明: N 是在 [0, 10^9] 范围内的一个整数。

暴力

逻辑上的判断没有什么难的,按常理来说暴力必超时。

Python

class Solution:def monotoneIncreasingDigits(self, N: int) -> int:for num in range(N, -1, -1):if list(str(num)) == sorted(list(str(num))):return num

贪心

如果整个数字 N 本身已经是按位单调递增的,那么最大的数字即为 N。

记 strN[i] 表示数字 N 从高到低的第 i 位的数字(i 从 0 开始)。

如果找到第一个位置 iii 使得 [0,i−1][0,i-1][0,i−1] 的数位单调递增且 strN[i−1]>strN[i]\textit{strN}[i-1]>\textit{strN}[i]strN[i−1]>strN[i],此时 [0,i][0,i][0,i] 的数位都与 NNN 的对应数位相等,仍然被 NNN 限制着,即我们不能随意填写 [i+1,n−1][i+1,n-1][i+1,n−1] 位置上的数字。为了得到最大的数字,我们需要解除 NNN 的限制,来让剩余的低位全部变成 999 ,即能得到小于 NNN 的最大整数。而从贪心的角度考虑,我们需要尽量让高位与 NNN 的对应数位相等,故尝试让 strN[i−1]\textit{strN}[i-1]strN[i−1] 自身数位减 111。此时已经不再受 NNN 的限制,直接将 [i,n−1][i, n-1][i,n−1] 的位置上的数全部变为 999 即可。

但这里存在一个问题:当 strN[i−1]\textit{strN}[i-1]strN[i−1] 自身数位减 111 后可能会使得 strN[i−1]\textit{strN}[i-1]strN[i−1] 和 strN[i−2]\textit{strN}[i-2]strN[i−2] 不再满足递增的关系,因此我们需要从 i−1i-1i−1 开始递减比较相邻数位的关系,直到找到第一个位置 jjj 使得 strN[j]\textit{strN}[j]strN[j] 自身数位减 111 后 strN[j−1]\textit{strN}[j-1]strN[j−1] 和 strN[j]\textit{strN}[j]strN[j] 仍然保持递增关系,或者位置 jjj 已经到最左边(即 jjj 的值为 000),此时我们将 [j+1,n−1][j+1,n-1][j+1,n−1] 的数全部变为 999 才能得到最终正确的答案。

Python

class Solution:def monotoneIncreasingDigits(self, N: int) -> int:index, strN = 1, list(str(N))while index < len(strN) and strN[index - 1] <= strN[index]:index += 1if index < len(strN):while index > 0 and strN[index - 1] > strN[index]:strN[index - 1] = str(int(strN[index - 1]) - 1)index -= 1for i in range(index + 1, len(strN)):strN[i] = '9'return int("".join(strN))

复杂度分析

  • 时间复杂度:O(log⁡N)O(\log N)O(logN),其中 O(log⁡N)O(\log N)O(logN) 表示数字 NNN 的位数。我们遍历 O(log⁡N)O(\log N)O(logN) 的时间即能构造出满足条件的数字。

  • 空间复杂度:O(log⁡N)O(\log N)O(logN)。我们需要 O(log⁡N)O(\log N)O(logN) 的空间存放数字 NNN 每一位的数字大小。

《每日一题》738. Monotone Increasing Digits 单调递增的数字相关推荐

  1. Leetcode 738. Monotone Increasing Digits

    原题链接:https://leetcode.com/problems/monotone-increasing-digits/description/ 描述: Given a non-negative ...

  2. 738. Monotone Increasing Digits

    内容: Given a non-negative integer N, find the largest number that is less than or equal to N with mon ...

  3. leetcode 738. Monotone Increasing Digits | 738. 单调递增的数字(Java)

    题目 https://leetcode.com/problems/monotone-increasing-digits/ 题解 先把 num 的每一位转化为数组. 从左往右找第一个 前>后 的位 ...

  4. leetcode第738题单调递增的数字

    leetcode第738题单调递增的数字 **贪心:**这个题目贪心的思路我是真找不见,和贪心相关联的地方在哪里呢? class Solution {public int monotoneIncrea ...

  5. 力扣刷题day32|738单调递增的数字、714买卖股票的最佳时机含手续费、968监控二叉树

    文章目录 738. 单调递增的数字 思路 难点:遍历顺序 难点:设置flag 714. 买卖股票的最佳时机含手续费 贪心思路 难点 968. 监控二叉树 思路 难点:如何隔两个节点放一个摄像头 738 ...

  6. 代码随想录训练营第37天|738.单调递增的数字、968.监控摄像头

    738.单调递增的数字.968.监控摄像头 738.单调递增的数字 对于单调递增的数字,我们可以逆序遍历一下数组,如果每个位置的数字都满足小于下一个位置,则说明这个位置满足条件. 如果一个数字不满足条 ...

  7. Leecode 738. 单调递增的数字 贪心

    原题链接:Leecode 738. 单调递增的数字 代码写的是真烂,,,可读性就是"仅自己可读"的程度... class Solution {public:int monotone ...

  8. _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 、714.买卖股票的最佳时机含手续费、968.监控二叉树

    _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 .714.买卖股票的最佳时机含手续费.968.监控二叉树 题目列表 738.单调递增的数字 714.买卖股票 ...

  9. 738. 单调递增的数字

    链接:738. 单调递增的数字 题解:https://leetcode-cn.com/problems/monotone-increasing-digits/solution/dan-diao-di- ...

最新文章

  1. 同时用引用和指针 int *a;
  2. jsp输入限制正则表达式
  3. 房贷利率不断上涨,贷款买房如何才能节省利息?
  4. 虚拟化运维工具对金融行业的解决方案
  5. MATLAB 将不同长度的一维数组存入二维数组
  6. 要求将数组中的0项去掉,将不为0的值存入一个新的数组,
  7. 【SGU】SGU每日练1·Little shop of flowers【DP】
  8. JEESZ-Zookeeper集群安装
  9. android 快捷方式代码片段随记
  10. Kubernetes CKA认证运维工程师笔记-Kubernetes存储
  11. Zemax操作--9(全局坐标设定及使用方法)
  12. 前端处理后端返回的二进制流文件
  13. less模块——math函数
  14. MySQL MGR 安装
  15. leetcode简单之613.直线上的最近距离
  16. 数据重塑_Google是否会重塑电话
  17. ubuntu 安装ttf-mscorefonts-installer
  18. 【Python】基于OpenCV与UDP实现的视频流传输
  19. GetKeyState和GetAsyncKeyState的区别
  20. 【ArcGIS教程】批量裁剪

热门文章

  1. C++ TR1、TR2与boost的关系
  2. UVa 11121 Base -2(负数进制)
  3. C语言训练题-铺草坪简易版
  4. 每日程序C语言16-找出比赛对手名单
  5. Java黑皮书课后题第3章:**3.9(商业:检验ISBN-10)ISBN-10由10个个位整数d1d2d3d4d5d6d7d8d9d10组成,最后一位d10是校验和,输入前9个数,显示10位ISBN
  6. C语言学习之利用指针输出二维数组任一行任一列元素的值
  7. Jmeter_简单的关联设置
  8. phpcms v9 的表单向导功能的使用方法
  9. 黑白棋子的移动(东方化改题+???)
  10. lintcode-93-平衡二叉树