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

文章目录

  • 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,找到idxwhile(!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.hqwc.cn/news/127619.html

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

相关文章

自动化测试 selenium+Junit 总结知识

文章目录 Selenium 自动化测试什么是selenium&#xff1f;selenium的原理是什么&#xff1f;Selenium 自动化测试的流程是什么&#xff1f;Selnium还有一些其他的操作 Selenium 如何定位动态元素&#xff1f; Junit 测试框架注解断言执行顺序测试套件参数化单参数多参数动态参数…

JS-Dom转为图片,并放入pdf中进行下载

1、将dom转换为图片 这里我们使用html2canvas工具插件先将dom转为canvas元素然后canvas拥有一个方法可以将绘制出来的图形转为url然后下载即可注意&#xff1a;如果元素使用了渐变背景并透明的话&#xff0c;生成的图片可能会有点问题。我下面这个案例使用了渐变背景实现元素对…

前端自动化测试入门教程

&#x1fab4; 背景 前端的自动化测试主要可以分为以下四种&#xff1a; 单元测试&#xff08;Unit Test&#xff09;&#xff1a;对一个函数/组件进行测试&#xff0c;一般用于公共函数/公共组件的测试维护。常用框架有 Jest、Jasmine、Mocha等&#xff1b; 集成测试&#x…

JMeter数据库性能测试指南:全面掌握基础操作

1.网络请求时间 2.数据库查询的时间 数据库性能指标 TPS:每秒事务数&#xff08;一秒钟服务器处理的事务数&#xff0c;事务指&#xff0c;请求出去到响应回来的整个过程的时间&#xff09; QPS:每秒查询量&#xff08;就是数据库每秒执行的SQL数量&#xff0c;包含insert/…

intel深度相机 D455及D4系列入门教程(逐行代码讲解)

1.介绍 Intel RealSense D435、D455等D4系列&#xff1a; Intel D4系列深度相机是由英特尔&#xff08;Intel&#xff09;公司推出的一款深度感知摄像头&#xff0c;专为实现计算机视觉和深度学习应用而设计。这款相机使用了英特尔的深度感知技术&#xff0c;结合了摄像头和红…

vue3+elementPlus el-input的type=“number“时去除右边的上下箭头

改成 代码如下 <script lang"ts" setup> import {ref} from vue const inputBtn ref() </script> <template><el-input type"number" v-model"inputBtn" style"width: 80px;" class"no_number">…

WPS/word 表格跨行如何续表、和表的名称

1&#xff1a;具体操作&#xff1a; 将光标定位在跨页部分的第一行任意位置&#xff0c;按下快捷键ctrlshiftenter&#xff0c;就可以在跨页的表格上方插入空行&#xff08;在空行可以写&#xff0c;表1-3 xxxx&#xff08;续&#xff09;&#xff09; 在空行中输入…

毛玻璃 has 选择器卡片悬停效果

效果展示 页面结构 从上述的效果展示可以看到&#xff0c;页面是由多个卡片组成&#xff0c;并且鼠标悬停在卡片上时&#xff0c;会旋转用户图片并且韩式对应的用户信息框。 CSS3 知识点 :has 属性的运用 实现页面整体结构 <div class"container"><div…

RT-Thread 内存管理(学习二)

内存堆管理应用示例 这是一个内存堆的应用示例&#xff0c;这个程序会创建一个动态的线程&#xff0c;这个线程会动态申请内存并释放&#xff0c;每次申请更大的内存&#xff0c;当申请不到的时候就结束。 #include <rtthread.h>#define THREAD_PRIORITY 25 #defi…

conda安装使用jupyterlab注意事项

文章目录 一、conda安装1.1 conda安装1.2 常见命令1.3 常见问题 二、jupyterlab2.1 jupyterlab安装和卸载2.2 常见错误2.2.1 版本冲突&#xff0c;jupyterlab无法启动2.2.2 插件版本冲突 2.3 常用插件2.3.1 debugger2.3.2 jupyterlab_code_formatter 2.4 jupyter技巧 一、conda…

Docker数据管理

容器中管理数据主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumes&#xff09; 数据卷容器&#xff08;Data Volume Dontainers&#xff09; Docker的数据管理 数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机的目录挂载到数据卷上&…

云服务器CVM_云主机_云计算服务器_弹性云服务器-腾讯云

腾讯云服务器CVM提供安全可靠的弹性计算服务&#xff0c;腾讯云明星级云服务器&#xff0c;弹性计算实时扩展或缩减计算资源&#xff0c;支持包年包月、按量计费和竞价实例计费模式&#xff0c;CVM提供多种CPU、内存、硬盘和带宽可以灵活调整的实例规格&#xff0c;提供9个9的数…