当前位置: 首页 > news >正文

【玩转贪心算法专题】738. 单调递增的数字【中等】

【玩转贪心算法专题】738. 单调递增的数字【中等】

1、力扣链接

https://leetcode.cn/problems/monotone-increasing-digits/description/

2、题目描述

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

给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。

示例 1:

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

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

输入: n = 332
输出: 299

提示:

0 <= n <= 109

3、题目分析

对于贪心算法的题目,可从 寻求局部最优解入手,以局部最优解,得到全局最优解
本题思路:
判断两数之间是否单调递增,如果不是则需要变化,将前一个数-1,后面全部置为9,但要主要需从后往前遍历
例如:332
如果从前往后遍历,第一次 33,没问题,第二次32,需要改为 329,但发现329其实并不能满足单调递增

4、代码实现

1、Java

class Solution {public int monotoneIncreasingDigits(int n) {String[] strings = (n + "").split("");//遍历看是否递增int start = strings.length;for(int i=strings.length-1;i>0;i--){if(Integer.parseInt(strings[i]) < Integer.parseInt(strings[i-1])){strings[i - 1] = (Integer.parseInt(strings[i - 1]) - 1) + "";start = i;}}while(start<strings.length){strings[start] ="9";start++;}return Integer.parseInt(String.join("",strings));}
}

2、C++

class Solution {
public:int monotoneIncreasingDigits(int N) {string strNum = to_string(N);// flag用来标记赋值9从哪里开始// 设置为这个默认值,为了防止第二个for循环在flag没有被赋值的情况下执行int flag = strNum.size();for (int i = strNum.size() - 1; i > 0; i--) {if (strNum[i - 1] > strNum[i] ) {flag = i;strNum[i - 1]--;}}for (int i = flag; i < strNum.size(); i++) {strNum[i] = '9';}return stoi(strNum);}
};

3、python

class Solution:def monotoneIncreasingDigits(self, N: int) -> int:# 将整数转换为字符串strNum = str(N)# flag用来标记赋值9从哪里开始# 设置为字符串长度,为了防止第二个for循环在flag没有被赋值的情况下执行flag = len(strNum)# 从右往左遍历字符串for i in range(len(strNum) - 1, 0, -1):# 如果当前字符比前一个字符小,说明需要修改前一个字符if strNum[i - 1] > strNum[i]:flag = i  # 更新flag的值,记录需要修改的位置# 将前一个字符减1,以保证递增性质strNum = strNum[:i - 1] + str(int(strNum[i - 1]) - 1) + strNum[i:]# 将flag位置及之后的字符都修改为9,以保证最大的递增数字for i in range(flag, len(strNum)):strNum = strNum[:i] + '9' + strNum[i + 1:]# 将最终的字符串转换回整数并返回return int(strNum)

4、go

func monotoneIncreasingDigits(N int) int {s := strconv.Itoa(N)//将数字转为字符串,方便使用下标ss := []byte(s)//将字符串转为byte数组,方便更改。n := len(ss)if n <= 1 {return N}for i := n-1; i > 0; i-- {if ss[i-1] > ss[i] {   //前一个大于后一位,前一位减1,后面的全部置为9ss[i-1] -= 1for j := i; j < n; j++ {   //后面的全部置为9ss[j] = '9'}} }res, _ := strconv.Atoi(string(ss))return res 
}

http://www.mrgr.cn/news/37252.html

相关文章:

  • 【Gitee自动化测试2】Git,TortoiseGit,Github,Gitlab,Gitee
  • 心觉:如何重塑高效学习的潜意识(3)东西很好,但用不起,怎么破?
  • C++学习笔记----8、掌握类与对象(一)---- 对象中的动态内存分配(4)
  • 【项目经验分享】深度学习点云算法毕业设计项目案例定制
  • 【机器学习】探索LSTM:深度学习领域的强大时间序列处理能力
  • Mysql InnoDB引擎的四大核心特性
  • 衡石分析平台系统管理手册-功能配置之全局 CSS 设置
  • Github 2024-09-27 Java开源项目日报Top8
  • python-list-comprehension-find-pair-given-sum-two-arrays
  • 【Python报错已解决】TypeError: tuple indices must be integers or slices, not str
  • 九、子查询
  • 在实时语音交互上超过GPT-4o,端到端语音模型Mini-Omni部署
  • 使用Keras进行图像分类:从入门到精通
  • Deno 1.46
  • 1.6 判定表
  • 网页制作Dreamweaver CC2024集成AI
  • Unity3D地形系统一口气讲完!谢啦!!☆⌒(*^-゜)v
  • 微软SCCM:企业级系统管理的核心工具
  • Svelte -用户点击屏幕时生成一系列飞出的粒子
  • Study Plan For Algorithms - Part41