当前位置: 首页 > 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 
}

相关文章:

  • 硬件设计很简单?合宙低功耗4G模组Air780E—开机启动及外围电路设计
  • 文件上传js代码
  • 华为认证HCIA篇--网络通信基础
  • JavaScript中if嵌套assert的方法
  • 【python append函数的一些细节】
  • 初步认识了解分布式系统
  • 货拉拉高级大数据平台算法工程师社招一面
  • 服务器数据恢复—SAN环境下LUN映射出错导致文件系统一致性出错的数据恢复案例
  • useCallback()
  • Linux安装vim超详细教程
  • Qt-QGroupBox容器类控件(39)
  • FortiGate 无线组网
  • Lucene 倒排索引原理详解:深入探讨相关算法设计
  • 精简解析:二叉树的遍历方法及其应用场景
  • 【TabBar嵌套Navigation案例-新特性页面-代码位置 Objective-C语言】
  • 分享的文章《人生如棋》
  • 2019年如何成为全栈工程师?
  • C++11: atomic 头文件
  • ComponentOne 2017 V2版本正式发布
  • ES6系列(二)变量的解构赋值
  • extjs4学习之配置
  • Git初体验
  • java正则表式的使用
  • PHP面试之三:MySQL数据库
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Shadow DOM 内部构造及如何构建独立组件
  • 大型网站性能监测、分析与优化常见问题QA
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 服务器从安装到部署全过程(二)
  • 技术发展面试
  • 离散点最小(凸)包围边界查找
  • 理解在java “”i=i++;”所发生的事情
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 突破自己的技术思维
  • 移动端唤起键盘时取消position:fixed定位
  • 字符串匹配基础上
  • 《天龙八部3D》Unity技术方案揭秘
  • NLPIR智能语义技术让大数据挖掘更简单
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • # centos7下FFmpeg环境部署记录
  • (阿里云万网)-域名注册购买实名流程
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (四)js前端开发中设计模式之工厂方法模式
  • (已解决)什么是vue导航守卫
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)ObjectiveC 深浅拷贝学习
  • (转载)Linux 多线程条件变量同步
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景