🚀题目
leetcode原题链接
当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。 给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。
示例 1: 输入: n = 10 输出: 9
示例 2: 输入: n = 1234 输出: 1234
示例 3: 输入: n = 332 输出: 299
提示: 0 <= n <= 109
💥leetcode代码模板
var monotoneIncreasingDigits = function(n) {
};
🚀思路
看到题目没有思路,那就先举几个例子,从简单开始:
对于一个位数大于二的数,我们是不是可以每次解决两位数,最终就解决了整个数字呢?可以的,我们可以遍历这个数的每一位,比较相邻的数字使它们满足单调递增。
这时候需要解决的另一个问题是遍历顺序的问题,是从前向后还是从后向前呢?举个例子吧: 从前向后:332 -> 332 -> 329 -> 299 从后向前:332 -> 329 -> 299 上面表示每次比较两位数字后得到的每一步的结果。 可以看到从前向后遍历会影响已经确定好的数字,而从后向前遍历时比较过的数字就不会再遍了,因此我们要采用从后向前的遍历顺序。
还要考虑一些情况,例如99 ,如果按照上面的思路实现应该是100 -> 90 ,但是结果应该是99 ,所以赋值9的操作应该将最后赋值9的位置以及之后的位置都赋值9,所以我们标记一下从哪个位置开始赋值9就好。
💻代码
var monotoneIncreasingDigits = function(n) {
let num = ('' + n).split('').map(x => Number(x))
let flag = num.length
for(let i = num.length - 1 ; i > 0 ; i--){
if(num[i] < num[i-1]){
flag = i
num[i-1]--
}
}
for(let i = flag ; i < num.length ; i++){
num[i] = 9
}
return parseInt(num.join(''))
};
🍪总结
这道题目利用了贪心的思想,每次解决两位数字(局部最优),最终可以解决整个数字(全局最优)。 还有没有思路时多举例子。
?
我
是
c
o
n
e
r
,
请
别
关
注
我
的
专
栏
,
本
系
列
文
章
为
个
人
刷
题
记
录
(
偷
偷
自
己
卷
🤤
)
:
\textcolor{green}{我是coner,请别关注我的专栏,本系列文章为个人刷题记录(偷偷自己卷🤤):}
我是coner,请别关注我的专栏,本系列文章为个人刷题记录(偷偷自己卷🤤):leetcode题解js
?
每
天
早
上
更
新
3
道
l
e
e
t
c
o
d
e
题
目
的
j
s
题
解
🚀
🚀
🚀
\textcolor{green}{每天早上更新3道leetcode题目的js题解🚀🚀🚀}
每天早上更新3道leetcode题目的js题解🚀🚀🚀
|