代码随想录贪心算法——单调递增的数字

题目

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

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

示例 1:

输入: N = 10 输出: 9 示例 2:

输入: N = 1234 输出: 1234 示例 3:

输入: N = 332 输出: 299 说明: N 是在 [0, 10^9] 范围内的一个整数。

思路

题目要求小于等于N的最大单调递增的整数,那么拿一个两位的数字来举例,如98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。

局部最优:遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]--,然后strNum[i]给为9,可以保证这两位变成最大单调递增整数。
全局最优:得到小于等于N的最大单调递增的整数

但是这里局部推出全局还需要一个遍历顺序,如果是从前往后遍历的话,那332举例,那么只能把332->329就结束了,但是如果从后往前遍历的话,就可以332->-329>299

所以本题是从后往前遍历,因为可以重复利用上次比较得出的结果

java代码如下:

class Solution {
	public int monotoneIncreasingDigits(int n){
		String s = String.valueOf(n);//String.valueOf()将基本数据类型转化成String类型,这里将n转化成字符串,比如12转化成“12”
		char[] chars = s.toCharArray();//再将字符串转化成字符数组
		int start = s.length();
		for(int i = s.length() - 2; i >= 0; i--){//从倒数第二个元素开始遍历,每次将后一个和当前元素进行比较
			if(chars[i] > chars[i+1]){//如果前一位大于后一位
				chars[i]--;
				start = i+1;//start记录需要全部修改成9的位置
			}
		}
		for(int i = start; i < s.length(); i++){
			chars[i] = '9';
		}
		return Integer.parseInt(String.valueOf(chars));//Integer.parseInt("123")表示将字符串"123"转化成整数123,String.valueOf(chars)表示把字符数组转化成字符串
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HDU-五七小卡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值