当前位置: 首页 > java >正文

单调栈所有模版类型(4)

最小字典序模版

最小字典序单调栈思路解析

1. 问题定义

给定一个字符串 num 和一个整数 k,要求移除 k 个字符后,使剩下的字符串是所有可能结果中字典序最小的。

2. 关键观察
  • 字典序特性:高位字符对字典序的影响大于低位字符。

  • 贪心选择:为了得到最小字典序,应尽可能让高位字符保持较小值。

3. 单调栈的作用
  • 维护单调递增栈:栈中存储字符,保证栈顶到栈底字符单调递增。

  • 移除策略

    • 当当前字符 s 小于栈顶字符且还可以移除字符(k > 0)时,弹出栈顶字符(相当于移除一个字符)。

    • 这样可以确保高位字符尽可能小。

4. 特殊处理
  • 前导零:如果栈为空且当前字符是 '0',则不压入栈(避免前导零)。

  • 剩余移除:如果遍历完字符串后仍有 k > 0,直接从栈末尾移除 k 个字符(因为此时栈是单调递增的,末尾字符较大)。

#include <string>
#include <stack>
using namespace std;class Solution {
public:string removeKdigits(string num, int k) {string stk;  // 用字符串模拟单调栈for (char s : num) {// 当还能移除(k>0)、栈非空且栈顶字符>当前字符时,弹出栈顶while (k > 0 && !stk.empty() && stk.back() > s) {stk.pop_back();k--;}// 避免前导零:栈为空时不压入'0'if (!(stk.empty() && s == '0')) {stk.push_back(s);}}// 处理剩余的k(移除末尾的k个字符)while (k-- > 0 && !stk.empty()) {stk.pop_back();}// 栈为空时返回"0",否则返回栈内容return stk.empty() ? "0" : stk;}
};

经典例题907. 子数组的最小值之和 - 力扣(LeetCode)

本文参考了力扣的灵山爱抚茶的题单分享|【算法题单】单调栈(矩形面积/贡献法/最小字典序)- 讨论 - 力扣(LeetCode)

http://www.xdnf.cn/news/4927.html

相关文章:

  • 为特定领域微调嵌入模型:打造专属的自然语言处理利器
  • 钉钉打卡教程
  • Go Modules 的基本使用
  • 什么是直播美颜SDK?跨平台安卓、iOS美颜SDK开发实战详解
  • 排序算法-希尔排序
  • 操作系统面试问题(4)
  • 不拆机查看电脑硬盘型号的常用方法
  • JVM之jcmd命令详解
  • 5月9号.
  • 如何删除豆包本地大模型
  • 《时序数据库全球格局:国产与国外主流方案的对比分析》
  • 23种设计模式-行为型模式之模板方法模式(Java版本)
  • 【NextPilot日志移植】logged_topics.cpp解析
  • 动态规划之背包问题:组合优化中的经典NP挑战
  • CCDO|企业数字化转型:机制革新与人才培育的双重引擎
  • 在 Ubuntu 上安装并运行 ddns-go 教程
  • 量化交易策略的运行
  • StreamRL:弹性、可扩展、异构的RLHF架构
  • Rust中记录日志:fast_log
  • 第一天——贪心算法——分饼干
  • 【软件设计师:软件】20.软件设计概述
  • Oracle链接服务器导致SQL Server异常终止
  • PHP会话技术
  • 机器学习与深度学习的区别与联系:多角度详细分析
  • Java 模板引擎 Thymeleaf JSP FreeMarker
  • 【物联网】基于树莓派的物联网开发【1】——初识树莓派
  • 塔能工业互联节能方案:数据驱动工业制造绿色转型
  • 遗传算法(GA)
  • MiM: Mask in Mask Self-SupervisedPre-Training for 3D Medical Image Analysis
  • 基于公共卫生大数据收集与智能整合AI平台构建测试:从概念到实践