《每日一题》738. Monotone Increasing Digits 单调递增的数字
给定一个非负整数 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(logN)O(\log N)O(logN),其中 O(logN)O(\log N)O(logN) 表示数字 NNN 的位数。我们遍历 O(logN)O(\log N)O(logN) 的时间即能构造出满足条件的数字。
空间复杂度:O(logN)O(\log N)O(logN)。我们需要 O(logN)O(\log N)O(logN) 的空间存放数字 NNN 每一位的数字大小。
《每日一题》738. Monotone Increasing Digits 单调递增的数字相关推荐
- Leetcode 738. Monotone Increasing Digits
原题链接:https://leetcode.com/problems/monotone-increasing-digits/description/ 描述: Given a non-negative ...
- 738. Monotone Increasing Digits
内容: Given a non-negative integer N, find the largest number that is less than or equal to N with mon ...
- leetcode 738. Monotone Increasing Digits | 738. 单调递增的数字(Java)
题目 https://leetcode.com/problems/monotone-increasing-digits/ 题解 先把 num 的每一位转化为数组. 从左往右找第一个 前>后 的位 ...
- leetcode第738题单调递增的数字
leetcode第738题单调递增的数字 **贪心:**这个题目贪心的思路我是真找不见,和贪心相关联的地方在哪里呢? class Solution {public int monotoneIncrea ...
- 力扣刷题day32|738单调递增的数字、714买卖股票的最佳时机含手续费、968监控二叉树
文章目录 738. 单调递增的数字 思路 难点:遍历顺序 难点:设置flag 714. 买卖股票的最佳时机含手续费 贪心思路 难点 968. 监控二叉树 思路 难点:如何隔两个节点放一个摄像头 738 ...
- 代码随想录训练营第37天|738.单调递增的数字、968.监控摄像头
738.单调递增的数字.968.监控摄像头 738.单调递增的数字 对于单调递增的数字,我们可以逆序遍历一下数组,如果每个位置的数字都满足小于下一个位置,则说明这个位置满足条件. 如果一个数字不满足条 ...
- Leecode 738. 单调递增的数字 贪心
原题链接:Leecode 738. 单调递增的数字 代码写的是真烂,,,可读性就是"仅自己可读"的程度... class Solution {public:int monotone ...
- _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 、714.买卖股票的最佳时机含手续费、968.监控二叉树
_32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 .714.买卖股票的最佳时机含手续费.968.监控二叉树 题目列表 738.单调递增的数字 714.买卖股票 ...
- 738. 单调递增的数字
链接:738. 单调递增的数字 题解:https://leetcode-cn.com/problems/monotone-increasing-digits/solution/dan-diao-di- ...
最新文章
- 同时用引用和指针 int *a;
- jsp输入限制正则表达式
- 房贷利率不断上涨,贷款买房如何才能节省利息?
- 虚拟化运维工具对金融行业的解决方案
- MATLAB 将不同长度的一维数组存入二维数组
- 要求将数组中的0项去掉,将不为0的值存入一个新的数组,
- 【SGU】SGU每日练1·Little shop of flowers【DP】
- JEESZ-Zookeeper集群安装
- android 快捷方式代码片段随记
- Kubernetes CKA认证运维工程师笔记-Kubernetes存储
- Zemax操作--9(全局坐标设定及使用方法)
- 前端处理后端返回的二进制流文件
- less模块——math函数
- MySQL MGR 安装
- leetcode简单之613.直线上的最近距离
- 数据重塑_Google是否会重塑电话
- ubuntu 安装ttf-mscorefonts-installer
- 【Python】基于OpenCV与UDP实现的视频流传输
- GetKeyState和GetAsyncKeyState的区别
- 【ArcGIS教程】批量裁剪
热门文章
- C++ TR1、TR2与boost的关系
- UVa 11121 Base -2(负数进制)
- C语言训练题-铺草坪简易版
- 每日程序C语言16-找出比赛对手名单
- Java黑皮书课后题第3章:**3.9(商业:检验ISBN-10)ISBN-10由10个个位整数d1d2d3d4d5d6d7d8d9d10组成,最后一位d10是校验和,输入前9个数,显示10位ISBN
- C语言学习之利用指针输出二维数组任一行任一列元素的值
- Jmeter_简单的关联设置
- phpcms v9 的表单向导功能的使用方法
- 黑白棋子的移动(东方化改题+???)
- lintcode-93-平衡二叉树