力扣第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; // 如果当前位大于之前遇到的最大值,返回false
            num = 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); // 将字符串转换为整数并返回
    }
};

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【DevChat】智能编程助手 - 使用评测

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

操作系统运行机制

文章目录 操作系统运行机制特权指令VS非特权指令内核态VS用户态中断和异常内中断(异常)外中断中断机制基本原理中断处理过程 系统调用系统调用和库函数的区别为什系统调用时必须的&#xff1f;什么功能需要用到系统调用系统调用的过程小结 操作系统内核 操作系统运行机制 特权…

Java 四种引用类型

文章目录 前言一、整体架构二、强引用&#xff08;Reference&#xff09;三、软引用&#xff08;SoftReference&#xff09;四、弱引用&#xff08;WeakReference&#xff09;五、虚引用&#xff08;PhantomReference&#xff09;六、引用队列&#xff08;ReferenceQueue&#…

React Hooks 实战案例

文章目录 一、React Hooks 简介二、React Hooks 的基本用法1. 使用 useState 创建状态2. 使用 useEffect 添加副作用 三、React Hooks 的常见问题1. 循环引用问题2. 副作用问题 四、React Hooks 实战案例1. 使用 useReducer 和 Redux&#xff1a;2. 使用 useContext&#xff1a…

如何使用drawio画流程图以及导入导出

画一个基本的流程图 你可以在线使用drawio, 或者drawon创建很多不同类型的图表。 如何使用编辑器&#xff0c;让我们以一个最基本的流程图开始。 流程图&#xff0c;就是让你可视化的描述一个过程或者系统。 图形和很少部分的文字表达就可以让读者很快的理解他们需要什么。 创…

07、SpringCloud -- jmeter 压测

目录 jmeter 入门jmeter 安装测试步骤测试数据模拟多用户操作1、创建http请求2、添加http cookie 管理器3、并发获取当前登录用户数据的效果4、添加多个用户模拟并发请求5、访问方法6、jmeter添加 CSV Data Set Config7、高并发执行访问的效果8、总结流程高并发秒杀压测jmeter …

Python 日期和时间处理教程:datetime 模块的使用

Python 中的日期不是独立的数据类型&#xff0c;但我们可以导入一个名为 datetime 的模块来使用日期作为日期对象。 示例&#xff1a;导入 datetime 模块并显示当前日期&#xff1a; import datetimex datetime.datetime.now() print(x)日期输出 当我们执行上面示例中的代码…

springboot web项目中 Set-Cookie 失败 办法

1. 背景 目前有个项目 线上环境 使用spring session管理的登录 项目中有两个接口 一个用来登录的 登录成功后会设置cookie 后续请求就会使用该cookie &#xff08;cookie的键值就是session Id 和 登录后的信息 例如菜单&#xff0c;权限等&#xff09; 一个用来检查是否登录…

LeetCode热题100 旋转图像

题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9…

2022年06月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 运行下列程序&#xff0c;输出的结果是&#xff1f;&#xff08; &#xff09; tup1 (苏炳添, 谷爱凌, 北京冬奥会, …

VSCode编写Unity代码自动补全配置

1.下载并安装.NET 7.0&#xff08;C#插件需要&#xff09;和.NET Framework 4.7.1&#xff08;Unity需要&#xff09; .NET 7.0下载链接&#xff1a;https://dotnet.microsoft.com/en-us/download .NET Framework 4.7.1下载链接&#xff1a;https://dotnet.microsoft.com/en-…

cmd基本命令

一、cmd黑框是什么 cmd 是 Windows 命令提示符&#xff08;cmd.exe&#xff09;是 Windows NT 及以后的 Windows 系统下的一个用于运行 Windows 控制面板程序或某些 DOS 程序的shell程序&#xff1b;或在 Windows CE 下只用于运行控制面板程序的外壳程序。 二、打开步骤 wind…

H5游戏源码分享-命悬一线

H5游戏源码分享-命悬一线 在合适的时机跳下绳子&#xff0c;能安全站到木桩上&#xff0c;就通过。 游戏源码 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><meta name&…

多线程---阻塞队列+生产者消费者模型

文章目录 阻塞队列自己实现一个阻塞队列&#xff08;三步&#xff09;标准库中的阻塞队列使用阻塞队列的优势 生产者消费者模型 阻塞队列 队列&#xff08;Queue&#xff09;是我们熟悉的一个数据结构&#xff0c;它是“先进先出”的。但是并不是所有的队列都是“先进先出”的…

RocketMq源码分析(八)--消息消费流程

文章目录 一、消息消费实现二、消息消费过程1、消息拉取2、消息消费1&#xff09;提交消费请求2&#xff09;消费消息 一、消息消费实现 消息消费有2种实现&#xff0c;分别为&#xff1a;并发消费实现&#xff08;ConsumeMessageConcurrentlyService&#xff09;和顺序消费实现…

pre-existing shared memory block

发生原因: 1.服务器cpu、内存进行扩容 2.非正常关闭,导致任在占用共享内存段 解决方案: 根据shmid进行关闭 ipcs -mipcrm -m xxx

Kotlin协程核心理解

一、协程是什么&#xff1f; 1.1 基本概念的理解 我们知道JVM中的线程的实现是依赖其运行的操作系统决定的&#xff0c;JVM只是在上层进行了API的封装&#xff0c;包含常见的有线程的启动方法&#xff0c;状态的管理&#xff0c;比如&#xff1a;Java中抽象出了6种状态&#x…

windows8080端口占用

查看端口占用 netstat -ano | findstr “8080”查看占用进程 tasklist | findstr “4664”关闭占用进程 taskkill /f /t /im httpd.exe

读图数据库实战笔记03_遍历

1. Gremlin Server只将数据存储在内存中 1.1. 如果停止Gremlin Server&#xff0c;将丢失数据库里的所有数据 2. 概念 2.1. 遍历&#xff08;动词&#xff09; 2.1.1. 当在图数据库中导航时&#xff0c;从顶点到边或从边到顶点的移动过程 2.1.2. 类似于在关系数据库中的查…

操作系统 --- 存储器管理

一、简答题 1.存储器管理的基本任务&#xff0c;是为多道程序的并发执行提供良好的存储器环境。请问好的存储器环境”应包含哪几个方面&#xff1f; 答&#xff1a; 2.内存保护是否可以完全由软件实现&#xff1f;为什么&#xff1f; 答&#xff1a;内存保护的主要任务是确保每…