738. 单调递增的数字
738. 单调递增的数字
题目
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)
示例 1:
输入: N = 10
输出: 9
示例 2:
输入: N = 1234
输出: 1234
示例 3:
输入: N = 332
输出: 299
说明: N 是在 [0, 10^9] 范围内的一个整
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/monotone-increasing-digits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
这个数n的长度我们是不知道的,那么如何获取每个位数的值?
可以转换成数组,高位在前面,低位在后面。
从后往前遍历比较,如231,暴力求解的话,应该先考虑231,230....这样才能返回符合条件的最大整数。并且如果从后往前遍历,修改了个位数的1,那跟着十位也要修改,那是不是还要考虑百位需不需修改?
那么比较之后,如果不符合条件要怎么修改?
条件1:找出小于或等于 N 的最大的整数
条件2:各个位数上的数字是单调递增
1比3小,那么不符合条件2,我们需要取比3大的,取3-9的哪一个?根据条件1,取最大的9并且需要让3-1,不然就不符合条件1了。
如果该位变成了9,那么该位后面的也要全部变成9。需要一个flag记录最后一个变9的位置。
代码
class Solution {
public int monotoneIncreasingDigits(int n) {
if(n<10)return n;
String num = n + "";
char[] arr=num.toCharArray();
int len = arr.length;
int flag=len;
for(int i=len-1;i>0;i--){
if(arr[i]<arr[i-1]){ //记录变为9的位置
flag = i;
arr[i-1] --; //前一位-1
}
}
//变为9的最高位的后面位全部都要为9
for (int i = flag; i < len; i++) {
arr[i] = '9';
}
return Integer.parseInt(new String(arr));
}
}
浙公网安备 33010602011771号