力扣第738题 单调递增的数字 c++ 暴力超时 贪心优化

题目

738. 单调递增的数字

中等

相关标签

贪心  数学

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

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

示例 1:

输入: n = 10
输出: 9

示例 2:

输入: n = 1234
输出: 1234

示例 3:

输入: n = 332
输出: 299

提示:

  • 0 <= n <= 109

思路和解题方法一 暴力  (只看看就行)

  1. 从N开始递减,设当前数字为i。
  2. 对于当前数字i,我们需要检查它的每一位是否递增。
  3. 我们可以通过将数字i转换为字符串,然后逐位比较来判断是否递增。
  4. 如果当前位大于等于前一位,我们继续检查下一位。
  5. 如果当前位小于前一位,说明不满足递增条件,我们停止检查,并将i减1。
  6. 重复步骤2-5,直到找到满足条件的数字或i变为0。
  7. 如果找到满足条件的数字,返回该数字作为最大递增数字;否则返回0。

复杂度

        时间复杂度:

                O(n* m)

        暴力解法的时间复杂度较高,为O(N*M),其中N是给定数字N的大小,M是数字N的位数。因为要对每个数字进行逐位比较,所以需要遍历N个数字,对于每个数字需要检查其位数M次。

        空间复杂度

                O(M)

空间复杂度为O(M),需要额外的存储空间来存储当前数字的字符串表示。

c++ 代码 一

class Solution {
private:// 判断一个数字的各位上是否是递增bool checkNum(int num) {int max = 10; // 初始化最大值为10,表示还没有遇到任何数字while (num) { // 对数字的每一位进行遍历int t = num % 10; // 取出当前位的数字if (max >= t) max = t; // 如果当前位小于等于之前遇到的最大值,更新最大值else return false; // 如果当前位大于之前遇到的最大值,返回falsenum = num / 10; // 去掉最低位,继续处理下一位}return true; // 如果所有位都满足递增条件,返回true}
public:int monotoneIncreasingDigits(int N) {for (int i = N; i > 0; i--) { // 从大到小遍历数字if (checkNum(i)) return i; // 如果数字的各位递增,返回该数字}return 0; // 如果没有找到满足条件的数字,返回0}
};

思路和解题方法二 贪心

  1. 首先,代码将给定数字N转换为字符串,方便后续操作。然后,使用一个变量flag来标记需要修改的位置,默认值为字符串的长度。
  2. 接下来,代码从字符串的末尾开始向前遍历,通过比较当前位和前一位的大小关系,找到第一个逆序对(即左边的数字大于右边的数字)。一旦找到逆序对,就将flag设置为当前位置,并将逆序对左边的数字减1。这样做的目的是保证当前位置及之后的所有位置都能取到9,从而满足递增条件。
  3. 最后,代码将flag位置及之后的所有位都设置为9,以确保得到的数字是小于等于N的最大递增数字。
  4. 最后,将修改后的字符串转换为整数并返回。

复杂度

        时间复杂度:

                O(M)

  

时间复杂度分析:

  1. 首先,我们将数字N转换为字符串表示,这需要O(M)的时间复杂度,其中M是数字N的位数。
  2. 在第一个for循环中,我们从后向前遍历字符串表示的数字,最多需要遍历M次。
  3. 在第一个for循环中,我们比较相邻的两个字符,并根据递减关系对前一位进行减1操作,最多需要比较M-1次。
  4. 在第二个for循环中,我们从标记位置开始,将后面的字符都设置为'9',最多需要修改M-flag次。
  5. 最后,我们将修改后的字符串转换回整数,这需要O(M)的时间复杂度。

综上所述,总的时间复杂度为O(M)。

        空间复杂度

                O(M)

空间复杂度分析:

  1. 我们使用了一个字符串strNum来存储数字N的字符串表示,需要额外的O(M)的空间。
  2. 除此之外,没有使用其他额外的空间。

综上所述,总的空间复杂度为O(M)。

c++ 代码 一

class Solution {
public:int monotoneIncreasingDigits(int N) {string strNum = to_string(N); // 将给定数字N转换为字符串int flag = strNum.size(); // 标记赋值9的起始位置,默认为字符串长度,用于防止第二个for循环在flag没有被赋值的情况下执行// 从后往前遍历字符串,如果发现当前位大于前一位,则将前一位减1,并将flag设置为当前位置for (int i = strNum.size() - 1; i > 0; i--) {if (strNum[i - 1] > strNum[i]) {flag = i;strNum[i - 1]--; // 将前一位减1}}// 将flag位置及之后的所有位都设置为9,以保证最大递增数字的性质for (int i = flag; i < strNum.size(); i++) {strNum[i] = '9'; // 将当前位置及之后的所有位设置为9}return stoi(strNum); // 将字符串转换为整数并返回}
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/174122.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精品基于Python的房地产分析平台-可视化大屏

《[含文档PPT源码等]精品基于Python的房地产分析平台的设计与实现-爬虫》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端…

Java VMTranslator Part I

目录 堆栈运算命令 基本思路 核心代码 Parser Code Writer Main 实验结果&#xff0c;使用SimpleAdd、StackTest进行验证 内存访问命令 基本思路 核心代码 Parser Code Writer Main 实验结果&#xff0c;使用进行验证。对比生成的二进制代码文件。 用Java写一个翻…

程序员为啥要做副业(02)-中指备用金

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

Linux — vim编辑器的操作

目录 1. vim的整体操作2. 命令模式下的常见命令3. 底行模式下的常见命令结语 1. vim的整体操作 我们使用 touch 创建一个文件之后&#xff0c;直接 vim 文件名 就能够进入到vim编辑器中。如果vim 文件名的文件还不存在时&#xff0c;vim会自动创建该文件&#xff0c;但需要保存…

Java 中的 synchronized 同步锁

导致线程安全问题的根本原因在于&#xff0c;存在多个线程同时操作一个共享资源&#xff0c;要想解决这个问题&#xff0c;就需要保证对共享资源访问的独占性&#xff0c;因此人们在Java中提供了synchronized关键字&#xff0c;我们称之为同步锁&#xff0c;它可以保证在同一时…

Spring Cloud之API网关(Gateway)

目录 API网关 好处 解决方案 Gateway 简介 特征 核心概念 Route(路由) Predicate(断言) Filter(过滤器) 工作流程 Route(路由) 路由配置方式 1.yml配置文件路由 2.bean进行配置 3.动态路由 动态路由 Predicate(断言) 特点 常见断言 示例 Filter(过滤器) …

IOC课程整理-19 Spring Environment 抽象

1. 理解 Spring Environment 抽象 2. Spring Environment 接口使用场景 3. Environment 占位符处理 4. 理解条件配置 Spring Profiles 5. Spring 4 重构 Profile 6. 依赖注入 Environment 7. 依赖查找 Environment 8. 依赖注入 Value 9. Spring 类型转换在 Environment 中的运用…

ZYNQ连载01-ZYNQ介绍

ZYNQ连载01-ZYNQ介绍 1. ZYNQ 参考文档&#xff1a;《ug585-zynq-7000-trm.pdf》 ZYNQ分为PS和PL两大部分&#xff0c;PS即ARM&#xff0c;PL即FPGA&#xff0c;PL作为PS的外设。 2. 方案 ZYNQ7020为双核A9架构&#xff0c;多核处理器常用的运行模式为AMP(非对称多处理)和…

测试C#调用Vlc.DotNet组件播放视频

除了Windows Media Player组件&#xff0c;在百度上搜索到还有不少文章介绍采用Vlc.DotNet组件播放视频&#xff0c;关于Vlc.DotNet的详细介绍见参考文献1&#xff0c;本文学习Vlc.DotNet的基本用法。   VS2022中新建基于.net core的winform程序&#xff0c;在Nuget包管理器中…

[论文精读]How Powerful are Graph Neural Networks?

论文原文&#xff1a;[1810.00826] How Powerful are Graph Neural Networks? (arxiv.org) 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#x…

脚本木马编写

PHP小马编写 小马用waf扫描&#xff0c;没扫描出来有风险。 小马过waf之后用echo $_SERVER[DOCUMENT_ROOT]获得当前运行脚本所在的文档根目录。&#xff0c;然后在上传大马工具。 $_SERVER&#xff0c;参考&#xff1a;PHP $_SERVER详解 小马编写二次加密 现在是可以被安全…

辅助驾驶功能开发-功能规范篇(22)-4-L2级辅助驾驶方案功能规范

1.3.4 LDW系统功能定义 1.3.4.1 状态机 1.3.4.2 功能定义 1.3.4.2.1 信号需求列表 1.3.4.2.2 系统开启关闭 1)初始化 车辆上电后,车道偏离预警系统(LDW)进行初始化,控制器需要在上电后 220ms 内发出第一帧报文,并在 3s 内 完成内部自检,同时上电 3s 内不进行关联系统…

ProEssentials pro v9 历史更新列表--注册版

ProEssentials标准版和专业版之间的唯一区别是可以渲染的数据点和注释的数量。标准版与专业版一样拥有所有的功能和接口。所有版本包括WPF、WinForm、WebForm、ActiveX、VCL和DLL接口。标准版仅限于8000个数据点和800个图表注释。此限制适用于每个控件实例。你可以运行多个控件…

H5游戏源码分享-像素小鸟游戏(类似深海潜艇)

H5游戏源码分享-像素小鸟游戏&#xff08;类似深海潜艇&#xff09; 点击屏幕控制小鸟的飞行高度 整个小游戏就用JS完成 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88483228 <!DOCTYPE HTML> <html><head><meta http-equiv…

荣耀推送服务消息分类标准

前言 为了提升终端用户的推送体验、营造良好可持续的通知生态&#xff0c;荣耀推送服务将对推送消息进行分类管理。 消息分类 定义 荣耀推送服务将根据应用类型、消息内容和消息发送场景&#xff0c;将推送消息分成服务通讯和资讯营销两大类别。 服务通讯类&#xff0c;包…

进程替换..

1、单进程版 – 最简单的先看看程序替换 现象就是 1、我们用自己的进程封装了内置指令ls,并且代码中execl 后 printf 的after并没有打印出来。 2、谈进程替换的原理 单进程替换基本原理 上面例子中execl的做法非常简单粗暴&#xff0c;要调用ls&#xff0c;那么就把mycom…

整型在内存中的存储

前言&#xff1a; 本文章旨在从例题中加深对整型在数据中的存储的相关知识的理解。 首先我们需要明确整型在内存中都是以补码的形式进行计算 例1&#xff1a; 解析&#xff1a; 首先我们需要明确整型在内存中都是以补码的形式进行计算。 接着将一个整型类型的数据存储在ch…

详细介绍如何使用 NeRF 进行 3D 体积渲染-附源码下载

介绍 在此示例中,我们展示了 Ben Mildenhall 等人的研究论文 NeRF:将场景表示为用于视图合成的神经辐射场的最小实现 。等人。作者提出了一种巧妙的方法,通过神经网络对体积场景函数进行建模来合成场景的新颖视图。 为了帮助您直观地理解这一点,让我们从以下问题开始: 是…

基于FPGA的图像PSNR质量评估计算实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 设置较大的干扰&#xff0c;PSNR15。 设置较小的干扰&#xff0c;PSNR25。 2.算法运行软件版本 matlab2022a vivado2019.2 3.部分核心程序 ti…

一周通过Professional Scrum Master(PSM1)考试准备分享

目录 一、为什么要考PSM 二、考试培训费用 三、学习时间 四、备考流程 1.通读Scrum Guide 2.完成Scrum Open的练习题3次 3.找题库刷题 4.再次完成Scrum Open的练习题3次 5.正式参加考试 五、其他考试准备 1.考试资格购买 2.语言 六、后记 一、为什么要考PSM 市面上有不少…