力扣第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.mzph.cn/news/123694.shtml

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

相关文章

ZYNQ连载03-Vivado创建工程

ZYNQ连载03-Vivado创建工程 1. 硬件参数 名称参数主控xc7z020clg400-2DDRMT41J256M16RE-125 2. 创建工程 3. 串口配置 4. DDR配置 5. SD配置 6. ETH配置 7. USB配置 8. 导出硬件 Generate Output ProductsCreate HDL WrapperExport Hardware Platform 执行以上步骤后&#…

leetCode 76. 最小覆盖子串 + 滑动窗口 + 哈希Hash

我的往期文章&#xff1a;此题的其他解法&#xff0c;感兴趣的话可以移步看一下&#xff1a; leetCode 76. 最小覆盖子串 滑动窗口 图解&#xff08;详细&#xff09;-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/134042115?spm1001.2014.3001.5501 力…

【软件安装环境配置】VsCode安装和配置各种环境(保姆级)

一、VsCode 下载 1.官网下载 网站&#xff1a;Visual Studio Code - Code Editing. Redefined 打开网站 点击Download 根据操作系统&#xff08;macOS、Windows、Linux&#xff09;和版本下载 下载到本地 注意&#xff1a; 若下载很慢&#xff0c;或者下着下着就暂停了 可…

【设计模式】第15节:行为型模式之“职责链模式”

一、简介 职责链模式&#xff1a;将请求的发送和接收解耦&#xff0c;让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链&#xff0c;并沿着这条链传递这个请求&#xff0c;直到链上的某个接收对象能够处理它为止。 二、优点 分离发送者和接受者易于扩展和维护…

【已解决】VSCode运行C#控制台乱码显示

问题描述 如上图所示&#xff0c;最近在学习C#突然发现我在运行Hello World的时候出现这样的乱码情况。 分析原因 主要是因为VS Code 是UTF-8的编码格式&#xff0c;而我们的PC是Unicode编码&#xff0c;所以我们需要对其进行一个统一即可解决问题。那么知道这个的问题那就开…

【Docker】如何查看之前docker run命令启动的参数

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…

H5游戏源码分享-密室逃脱小游戏(考验反应能力)

H5游戏源码分享-密室逃脱小游戏&#xff08;考验反应能力&#xff09; 预判安全位置&#xff0c;这个需要快速的反应能力 源码 <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /&…

1.spark standalone环境安装

概述 环境是spark 3.2.4 hadoop版本 3.2.4&#xff0c;所以官网下载的包为 spark-3.2.4-bin-hadoop3.2.tgz 在具体安装部署之前&#xff0c;需要先下载Spark的安装包&#xff0c;进到 spark的官网&#xff0c;点击download按钮 使用Spark的时候一般都是需要和Hadoop交互的&a…

10_4阻塞和非阻塞跟poll和等待队列

阻塞和非阻塞 广泛上的区别就是 应用程序如果非阻塞那读取不到数据就应该马上有返回值 阻塞的话就是在应用程序去read数据,但是设备驱动没有数据,就一直卡住,直到有数据再继续往下 补充阻塞知识,应用层大部分都是阻塞 如果要非阻塞 ,应用程序在打开设备节点的时候填写int fd …

辅助驾驶功能开发-功能规范篇(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 内不进行关联系统…

ActiveMQ

ActiveMQ 安装 下载网址&#xff1a;ActiveMQ 一定要和自己安装的jdk版本匹配&#xff0c;不然会报错 下载到本地之后解压缩 有可能端口号被占用 解除端口号占用&#xff0c;参考&#xff1a;Windows_端口被占用 打开cmd 查询所有的端口号 netstat -nao查询指定端口号 n…

数组元素逆序交换

数组元素逆序交换 例如&#xff1a; 输入&#xff1a; 1,2,3,4,5 输出&#xff1a; 5,4,3,2,1 代码&#xff1a; #include<stdio.h> #define N 5 int main() {int a[N], i, temp;for (i 0; i < N; i) {scanf("%d", &a[i]);}for (i 0; i < N…

C语言选择排序

1.选择排序(Selection sort) 选择排序是简单直观的排序算法。 基本思想&#xff1a;从首元素开始&#xff0c;首元素与它后面的所有元素进行比较&#xff0c;找到数列中最小的元素&#xff0c;与首元素值交换。然后下一个元素与它后面的元素比较&#xff0c;得到第二小的元素…

对Linux线程的理解(什么是线程,线程的创建终止等待分离,线程互斥,Linux常见的锁,线程同步),两万字总结,有这一篇文章就够了!

文章目录 一、什么是线程1.线程是怎样描述的2.线程与进程的区别3.线程的优缺点4.理解Linux的轻量级进程 二、Linux线程控制1.线程创建:pthread_create()2.线程终止:pthread_exit()3.线程等待:pthread_join()4.分离线程:pthread_detach() 三、Linux线程互斥1.互斥量2.线程安全与…

我在Vscode学OpenCV 初步接触

OpenCV是一个开源的计算机视觉库&#xff0c;可以处理图像和视频数据。它包含了超过2500个优化过的算法&#xff0c;用于对图像和视频进行处理&#xff0c;包括目标识别、面部识别、运动跟踪、立体视觉等。OpenCV支持多种编程语言&#xff0c;包括C、Python、Java等&#xff0c…

在HTML当中引入Vue控件,以element-ui为例

前情&#xff1a;需要实现一个同时满足按天、按周、按月选择的时间选择器&#xff0c;但是以HTML为基础写的都不太满足我的要求&#xff0c;要么只能按天选择&#xff0c;要么就是想选择久远的时间得点很久&#xff0c;除非自己写捷径&#xff0c;所以就看上了element-ui的这个…

动静分离技术

一、HAproxy 动静分离 1、概念&#xff1a; HAproxy 动静分离技术是一种用于优化 Web 服务器性能和提高用户体验的策略&#xff0c;它通过将动态内容和静态内容分别路由到不同的后端服务器来实现&#xff0c;减轻服务器负载&#xff0c;提高网站的响应速度。 动态内容包括由…

SylixOS BSP开发(七)

实现系统调试信息打印接口 当系统出错时或者使用内核日志时会输出一些打印信息&#xff0c;这最终都是调用到bspLib.c中的bspDebugMsg 这个接口来实现的&#xff0c;所以我们在开发BSP时&#xff0c;第一个要做的工作就是实现这个接口。 一般的调试信息都是通过串口来输出的&am…

经典目标检测神经网络 - RCNN、SSD、YOLO

文章目录 1. 目标检测算法分类2. 区域卷积神经网络2.1 R-CNN2.2 Fast R-CNN2.3 Faster R-CNN2.4 Mask R-CNN2.5 速度和精度比较 3. 单发多框检测&#xff08;SSD&#xff09;4. YOLO 1. 目标检测算法分类 目标检测算法主要分两类&#xff1a;One-Stage与Two-Stage。One-Stage与…

虚拟机Ubuntu下运行vue-element-admin项目

一.环境搭建 1.安装nodejs sudo apt install nodejs 安装完成后&#xff0c;查看对应的版本号 nodejs -v没有问题&#xff0c;会输出对应版本号&#xff0c;我这里是10.19.0 v10.19.0 2.安装npm sudo apt install npm安装完成查看对应的版本号&#xff0c;确认OK npm -…