【单调栈】下一个更大元素 III

news2024/11/24 7:20:56

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:下一个排列
  • 写在最后

Tag

【单调栈】【数组】【字符串】


题目来源

556. 下一个更大元素 III


题目解读

找出大于整数的最小整数,这个最小整数必须由原来整数中出现的数字组成。


解题思路

方法一:下一个排列

我们将 n 转换成字符串之后,本题就是在求字符数组的 31. 下一个排列。直接贴出代码如下:

实现代码

class Solution {
public:
    int nextGreaterElement(int n) {
        string str = to_string(n);
        int strLen = str.size();
        int i = strLen - 2;
        // 找str中违反字符数字是降序的第一个字符(从后往前的第一个)
        while (i >= 0 && str[i] >= str[i+1]) {
            --i;
        }
        if (i < 0) return -1;                       // str 字符数字是降序的,无答案

        // 找 str[i] 右侧比 str[i] 大的最小的字符
        int j = strLen - 1;
        while (j >= 0 && str[i] >= str[j]) {
            --j;
        }
        swap(str[i], str[j]);
        reverse(str.begin() + i + 1, str.end());    // 也可以进行排序
        long res = stol(str);
        return res > INT_MAX ? -1 : res;
    }
};

单调栈

str[i] 右侧比 str[i] 大的最小的字符,可以使用单调栈来解决。直接贴上代码:

class Solution {
public:
    int nextGreaterElement(int n) {
        string str = to_string(n);
        int strLen = str.size();

        int i = strLen - 1;
        int idx = 0;        // 找 `str[i]` 右侧比 `str[i]` 大的最小的字符
        stack<int> stk;
        
        for (; i >= 0; --i) {
            // 如果从后往前一直是递增的就一直加入栈,直到遇到违反递增的第一个字符,下标为i,找到idx
            while(!stk.empty() && str[i] < str[stk.top()]) {
                idx = stk.top();
                stk.pop();
            }
            // 将 str[i] 与其右侧比 str[i] 大的最小字符交换
            if (idx != 0) {
                swap(str[i], str[idx]);
                break;
            }
            stk.push(i);
        }
        // idx 一直没有更新,说明 str 从后往前一直是递增的
        if (idx == 0) return -1;
        reverse(str.begin() + i + 1, str.end());    // 也可以进行排序
        long res = stol(str);
        return res > INT_MAX ? -1 : res;
    }
};

复杂度分析

时间复杂度: O ( l o g n ) O(logn) O(logn) m m m 是整数 n 转化成字符串后的长度,其实有 m = logn,本题需要对长度为 m m m 的字符进行一次遍历操作,因此时间复杂度为 O ( m ) O(m) O(m),即 O ( l o g n ) O(logn) O(logn)

空间复杂度: O ( l o g n ) O(logn) O(logn),使用的额外字符串,长度为 O ( l o g n ) O(logn) O(logn)


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

冲刺第十五届蓝桥杯P0003倍数问题

文章目录 原题连接解析代码 原题连接 倍数问题 解析 需要找出三个数字&#xff0c;三个数字之和是k的倍数&#xff0c;并且这个数字需要最大&#xff0c;很容易想到的就是将数组进行倒叙排序&#xff0c;然后三层for循环解决问题&#xff0c;但是这样会导致**时间复杂度很高…

Appium问题及解决:打开Appium可视化界面,点击搜索按钮,提示inspectormoved

打开Appium可视化界面&#xff0c;点击搜索按钮&#xff0c;提示inspectorMoved&#xff0c;那么如何解决这个问题呢&#xff1f; 搜索了之后发现&#xff0c;由于高版本Appium&#xff08;从1.22.0开始&#xff09;的服务和元素查看器分离&#xff0c;所以还需要下载Appium In…

深入了解“注意力”和“变形金刚”-第2部分

一、说明 在上一个故事中,我已经解释了什么是注意力机制,以及与转换器相关的一些重要关键字和块,例如自我注意、查询、键和值以及多头注意力。 在这一部分中,我将解释这些注意力块如何帮助创建转换器网络,并详细

sed 命令

sed是Stream Editor&#xff08;字符流编辑器&#xff09;的缩写&#xff0c;简称流编辑器。 sed 命令是一个面向行处理的工具&#xff0c;它以“行”为处理单位&#xff0c;针对每一行进行处理&#xff0c;处理后的结果会输出到标准输出stdout。sed 命令是很懂礼貌的一个命令&…

CentOS 7 使用Docker

参考资料 Docker命令大全 黑马程序员docker实操教程 &#xff08;黑马讲的真的不错 容器与虚拟机 安装 yum install -y docker Docker服务命令 启动服务 systemctl start docker停止服务 systemctl stop docker重启服务 systemctl restart docker查看docker服务状态 syste…

拨2个号时报错All TAP-Windows adapters on this system are currently in use.

管理员运行addtap.bat 可以看到&#xff0c;有两个TAP-Windows Adapter V9适配器了

拼多多API接口的使用方针如下:

了解拼多多API接口 拼多多API接口是拼多多网提供的一种应用程序接口&#xff0c;允许开发者通过程序访问拼多多网站的数据和功能。通过拼多多API接口&#xff0c;开发者可以开发各种应用程序&#xff0c;如店铺管理工具、数据分析工具、购物比价工具等。在本章中&#xff0c;我…

管易云与网易互客对接集成发货单查询2.0连通编辑订单(管易包裹物流=>互客销售订单物流(修改)V1)

管易云与网易互客对接集成发货单查询2.0连通编辑订单(管易包裹物流>互客销售订单物流&#xff08;修改&#xff09;V1) 来源系统:管易云 管易云是金蝶旗下专注提供电商企业管理软件服务的子品牌&#xff0c;先后开发了C-ERP、EC-OMS、EC-WMS、E店管家、BBC、B2B、B2C商城网站…

在PyCharm中添加anaconda环境

本文略过创建anaconda环境的部分~ 下文默认anaconda环境已经创建好 1. 点击新建项目 2. 1&#xff09;修改项目名称 2&#xff09;选择 “Previously configured interpreter” 曾经配置的解释器 3&#xff09;选择“Add Interpreter” 添加新的解释器 3. 选择 “A…

外包干了2个月,技术退步明显....

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了四年…

javaee之Elasticsearch相关知识

简单说一下Elasticsearch相关知识 其余的参考官网文档 我们还可以用下面的方式来查 看一下原始索引库的模板 下面看一下数据库映射关系 下面就是更改了id1的所有数据 下面是我索引库中的内容 说一下查询之后&#xff0c;一些属性的含义 上面案例是这样理解的 match查询类型会对…

【微信小程序】初始微信小程序

&#x1f5a5;️&#x1f5a5;️&#x1f5a5;️ 博主主页&#xff1a; &#x1f449;&#x1f3fb; &#x1f449;&#x1f3fb; &#x1f449;&#x1f3fb; 糖 &#xff0d;O&#xff0d; &#x1f6a9;&#x1f6a9;&#x1f6a9;微信小程序专栏&#xff1a;微信小程序 &…

设计模式再探——模板方法模式

目录 一、背景介绍二、思路&方案三、过程1.模板方法模式简介2.模板方法模式的类图3.模板方法模式代码4.模板方法模式中的父类为抽象类&#xff0c;为什么不是接口&#xff1f;5.模板方法模式中方法级别的单一职责 四、总结五、升华 一、背景介绍 最近公司在做颗粒业务的时…

关于Chrome浏览器打开某网页报 连接已重置 的解决方法

问题描述&#xff1a; Chrome浏览器&#xff08;117版本&#xff09;昨天打开内网站点正常&#xff0c;今天打开时报连接已重置&#xff0c;网页打不开。其他浏览器打开正常。 解决方案1&#xff1a;刷新DNS &#xff0d;&#xff0d;&#xff0d; 失败 1、 打开命令行窗口 2、…

超简单的视频截取方法,迅速提取所需片段!

“视频可以截取吗&#xff1f;用相机拍摄了一段视频&#xff0c;但是中途相机发生了故障&#xff0c;录进去了很多不需要的片段&#xff0c;现在想截取一部分视频出来&#xff0c;但是不知道方法&#xff0c;想问问广大的网友&#xff0c;知不知道视频截取的方法。” 无论是工…

葡萄酒按名称分类保护的重要事件有哪些?

葡萄酒可以根据各种方法来进行分类&#xff0c;可以是原产地或称谓&#xff0c;可以是酿造方法和风格&#xff0c;可以是甜味和年份&#xff0c;也可以是使用的葡萄品种。来自云仓酒庄品牌雷盛红酒分享不同原籍国和地区对葡萄酒的分类做法各不相同&#xff0c;许多做法会随着时…

Linux 安装

本章节我们将为大家介绍 Linux 的安装&#xff0c;安装步骤比较繁琐&#xff0c;现在其实云服务器挺普遍的&#xff0c;价格也便宜&#xff0c;如果自己不想搭建&#xff0c;也可以直接买一台学习用用. 本章节以 centos6.4 为例。 centos 下载地址&#xff1a; 可以去官网下载…

python3.0 安装后再 cmd下弹win10应用商店的问题

1、问题描述 安装了最新的python安装包后&#xff0c;再cmd上输入&#xff1a;python --version 无效&#xff0c; 然后输入 python 后弹出商店。 2、问题解决 看了很多解决办法都是编辑用户环境变量&#xff0c;将这个python的环境变量放在windowsApps上面&#xff0c;尝试了…

3D灌篮高手

欢迎来到程序小院 3D灌篮高手 玩法&#xff1a; 鼠标左键点击按住屏幕&#xff0c;左边力度条在红色区域时松开鼠标投篮&#xff0c;30秒内完成投篮&#xff0c;统计投中次数&#xff0c;快去成为灌篮高手吧^^。开始游戏https://www.ormcc.com/play/gameStart/186 html <d…

vcruntime140.dll找不到的解决方法-vcruntime140.dll日常修复方法分享

大家好&#xff01;今天&#xff0c;非常荣幸地向大家分享一个与我们日常生活息息相关的话题——电脑计算机突然出现vcruntime140.dll丢失如何修复。作为一名学生 &#xff0c;我们每天都在使用电脑&#xff0c;而这个问题可能会时不时地困扰我们。那么&#xff0c;面对这个问…