738.单调递增的数字

738.单调递增的数字

力扣题目链接(opens new window)

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

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

示例 1:

  • 输入: N = 10
  • 输出: 9

示例 2:

  • 输入: N = 1234
  • 输出: 1234

示例 3:

  • 输入: N = 332
  • 输出: 299

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

思路:贪心

从左往右遍历各位数字,找到第一个开始下降的数字[i],将[i]减1,然后将[i+1 …]各位数字全部置为9即可
例如:1232123,从左往右遍历,找到第一个开始下降的数字3,将3改为2,然后将后面所有数字全部置为9,最后为:1229999 即为答案
【需要注意一点】:如果第一个开始下降的数字[i],前面还有与其相等的数字,需要找到最前面的一个数字作为上面所说的[i]
例如:13332,从左往右遍历,找到第一个开始下降的数字3,往前再看下,是否还有等于3的数字,找到最前面那个3,将3改为2,然后将后面的各个数字置为9,最后为:12999
贪心算法局部最优解:找到第一个开始下降的数字
贪心算法整体最优解:得到小于或等于 N 的最大单调自增整数

时间复杂度 : O(N)
空间复杂度 : O(N)

代码如下

public static void main(String args[]) {
    monotoneIncreasingDigits(100);
}


public static int monotoneIncreasingDigits(int n) {
    if (n < 10)
        return n;
    String str = String.valueOf(n);// 将n转化为字符串数组
    char[] numIndex = str.toCharArray();

    int index = 0;
    boolean flag = true;// 判断数字是否符合要求
    for (int i = 0; i < str.length() - 1; i++) {
        if (numIndex[i] < numIndex[i + 1]) {
            index = i + 1;
        }
        if (numIndex[i] > numIndex[i + 1]) {
            flag = false;
            break;
        }
    }
    if (flag)// 整个数字符合要求,直接返回
        return Integer.parseInt(String.valueOf(numIndex));

    numIndex[index]--;
    for (int i = index + 1; i < str.length(); i++) {
        numIndex[i] = '9';
    }
    return Integer.parseInt(String.valueOf(numIndex));

}

问题

分割N各位数字,并保存在数组中
采用整形数组方式,不仅使用了For循环,而且代码多

代码如下

 int length = String.valueOf(n).length();
   int[] numIndex = new int[length];
   int temp = n;
   for (int i = length - 1; i >= 0; i--) {// 分割数字,保存在数组中
        numIndex[i] = temp % 10;
        temp = temp / 10;
   }

采用字符数组的方式,简简单单两行代码

代码如下

String str = String.valueOf(n);// 将n转化为字符串数组
char[] numIndex = str.toCharArray();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值