2025年- H107-Lc215--738.单调递增数列(贪心)--Java版

1.题目描述

在这里插入图片描述

2.思路

局部最优:遇到nums[i-1]>nums[i],将nums[i-1]减1,将nums[i]赋值成9,可以把这两个整数变成最大单调递增的整数。
全局最优:得到小于或等于N的最大单调递增的整数。
举一个例子:
n=332
(1)
right=3
当i等于下标为2的时候
for (int i = nums.length - 1; i >= 1; i–) {
nums[1]>nums[2] //3>2
{
right=2=i;
nums[1]=2;
}
for(i=right;i<3;i++)
{
nums[2]=9
}
res=329,还是不符合
(2)
当i=1时
for (int i = 1; i >= 1; i–) {
nums[0]>nums[1] //3>2
{
right=1=i;
nums[0]=2;
}
//从索引 right 开始,一直到最后一个元素,把这一段里的所有字符都改成 字符 ‘9’。
for(i=right;i<3;i++)
{
nums[1]==9
}
res=299,符合

3.代码实现

public class Test4 {
    public static void main(String[] args) {

        Test4 test = new Test4();
        int num = 10;
        System.out.println(test.monotoneIncreasingDigits(num));
    }

    public int monotoneIncreasingDigits(int n) {
        // 如果是个位数,直接返回
        if (n < 10) {
            return n;
        }
        // 把整数转换成字符串
        String s = String.valueOf(n);
        // 把字符串转换成字符数组
        char[] nums = s.toCharArray();
        // right用来标记9从哪里开始
        // right设置成默认值,为了防止right没有被赋值的情况下执行第2个for循环
        int right = nums.length;// 从哪个位置开始全变 9
        // 从后往前扫描
        for (int i = nums.length - 1; i >= 1; i--) {
            if (nums[i - 1] > nums[i]) {// 出现非递增
                // 当前字符做一个标记
                right = i; // 标记右边界
                nums[i - 1]--; // 高位减 1
            }

        }
        ////从索引 right 开始,一直到最后一个元素,把这一段里的所有字符都改成 字符 '9'。
        for (int i = right; i < nums.length; i++) {
            nums[i] = '9';
        }
        String res = new String(nums);
        return Integer.parseInt(res);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值