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

这篇具有很好参考价值的文章主要介绍了力扣第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。

力扣第738题 单调递增的数字 c++ 暴力超时 贪心优化,leetcode,贪心,暴力,数据结构,leetcode,c++,算法,贪心算法,暴力

复杂度

        时间复杂度:

                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); // 将字符串转换为整数并返回
    }
};

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

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

每天都会不定时更新哦  >人<  。文章来源地址https://www.toymoban.com/news/detail-715461.html

到了这里,关于力扣第738题 单调递增的数字 c++ 暴力超时 贪心优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 贪心算法part6 | ● 738.单调递增的数字 ● 968.监控二叉树

    代码随想录算法训练营第一天 | 题目、题目 738.单调递增的数字 局部最优:前一个数比当前数小,前一个数位减一,当前数置为9 题目要求小于等于N的最大单调递增的整数,那么拿一个两位的数字来举例。 例如:98,一旦出现strNum[i - 1] strNum[i]的情况(非单调递增),首先想

    2024年02月10日
    浏览(8)
  • 算法训练day37|贪心算法 part06(LeetCode738.单调递增的数字)

    题目链接🔥🔥 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。 (当且仅当每个相邻位数上的数字 x 和 y 满足 x = y 时,我们称这个整数是单调递增的。) 示例 1: 输入: N = 10 输出: 9 示例 2: 输入: N = 1234 输出:

    2024年02月09日
    浏览(10)
  • 算法打卡day32|贪心算法篇06|Leetcode 738.单调递增的数字、968.监控二叉树

    算法打卡day32|贪心算法篇06|Leetcode 738.单调递增的数字、968.监控二叉树

    Leetcode 738.单调递增的数字 题目链接:738.单调递增的数字  大佬视频讲解:单调递增的数字视频讲解  个人思路 这个题目就是从例子中找规律,例如 332,从后往前遍历,32不是单调递增将2变为9,3减1,变成了329,遍历到2,32不是递增,将2变为9,3减1,变成299,符合题目条件,打印

    2024年04月16日
    浏览(6)
  • 【LeetCode题目详解】第八章 贪心算法 part06 738.单调递增的数字 968.监控二叉树 (day37补)

    【LeetCode题目详解】第八章 贪心算法 part06 738.单调递增的数字 968.监控二叉树 (day37补)

    当且仅当每个相邻位数上的数字  x  和  y  满足  x = y  时,我们称这个整数是 单调递增 的。 给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。 示例 1: 示例 2: 示例 3: 提示: 0 = n = 109 # 暴力解法 题意很简单,那么首先想的就是暴力解法了,来我替大家

    2024年02月10日
    浏览(10)
  • 力扣第501题 二叉树的众数 c++ (暴力 加 双指针优化)

    力扣第501题 二叉树的众数 c++ (暴力 加 双指针优化)

    501. 二叉搜索树中的众数 简单 相关标签 树   深度优先搜索   二叉搜索树   二叉树 给你一个含重复值的二叉搜索树(BST)的根节点  root  ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。 如果树中有不止一个众数,可以按  任意顺序  返回。 假定 BST 满足

    2024年02月07日
    浏览(5)
  • 「暴力」拿出最少数目的魔法豆(力扣第2171题)

    本题为1月18日力扣每日一题 题目来源:力扣第2171题 题目tag: 数位dp 动态规划 给定一个正整数数组beans,其中每个整数表示一个袋子里装的魔法豆的数目。 请你从每个袋子中拿出一些豆子(也可以不拿出),使得剩下的非空袋子中(即至少还有一颗魔法豆的袋子)魔法豆的数目

    2024年01月18日
    浏览(8)
  • 单调递增的数字+监控二叉树

    单调递增的数字+监控二叉树

    前一位减一的话,后面的所有位可以取到9,要从后往前遍历,保证单调递增,后面变小了,前面也要变小 String.valueOf 转换为String类型, Integer 类的 valueOf 方法 :将字符串或其他可以表示整数的数据转换为 Integer 对象。 监控二叉树(四种情况,主要是根节点为0不容易想到 三

    2024年04月26日
    浏览(8)
  • DAY40:贪心算法(九)单调递增的数字(贪心的思路)

    DAY40:贪心算法(九)单调递增的数字(贪心的思路)

    本题暴力解法也需要看一下,虽然暴力解法超时了,但是这种思路是一种很基础的思路,需要了解 数字是没有办法直接采用下标遍历的 ,如果 要for循环遍历每个位置的数字,需要把数字转成字符串string 当且仅当每个相邻位数上的数字 x 和 y 满足 x = y 时,我们称这个整数是

    2024年02月12日
    浏览(8)
  • 算法刷题Day 37 单调递增的数字+监听二叉树

    两个可能经常要用到的函数 字符串转数字: to_string() 数字转字符串: stoi() 利用树后续遍历,同时加上状态转移的方法,非常值得反复学习

    2024年02月13日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包