恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
053【必备】单调栈
首页
资讯中心
/
053【必备】单调栈
053【必备】单调栈
发布时间:2026/10/3 7:06:52
962. 最大宽度坡给定一个整数数组A坡是元组(i, j)其中i j且A[i] A[j]。这样的坡的宽度为j - i。找出A中的坡的最大宽度如果不存在返回 0 。示例 1输入[6,0,8,2,1,5]输出4解释最大宽度的坡为 (i, j) (1, 5): A[1] 0 且 A[5] 5.示例 2输入[9,8,1,0,1,9,4,0,4,1]输出7解释最大宽度的坡为 (i, j) (2, 9): A[2] 1 且 A[9] 1.提示2 A.length 500000 A[i] 50000class Solution { public: int maxWidthRamp(vectorint nums) { int nnums.size(); stackintst; st.push(0); //从左到右建单调递减栈 for(int i1;in;i) { if(nums[i]nums[st.top()]) st.push(i); } int ans0; //从右到左匹配更新答案 for(int in-1;i1;i--) { while(!st.empty() and nums[i]nums[st.top()]) { ansmax(ans,i-st.top()); st.pop(); } } return ans; } };316. 去除重复字母给你一个字符串s请你去除字符串中重复的字母使得每个字母只出现一次。需保证返回结果的字典序最小要求不能打乱其他字符的相对位置。示例 1输入s bcabc输出abc示例 2输入s cbacdcbc输出acdb提示1 s.length 104s由小写英文字母组成注意该题与 1081 1081. 不同字符的最小子序列 - 力扣LeetCode 相同class Solution { public: string removeDuplicateLetters(string s) { int ns.size(); unordered_mapchar,intmp;//词频表 for(auto e:s) mp[e]; //单调栈 stackcharst; //标记字符有没有在栈中 vectorintvis(26,false); for(auto cur:s) { //如果当前字符没有进过栈 if(vis[cur-a]false) { //如果栈顶字符比当前字符大 //并且栈顶字符后续还会出现 //就把栈顶字符清掉用当前字符替代 while(!st.empty() and curst.top() and mp[st.top()]0) { vis[st.top()-a]false; st.pop(); } st.push(cur); vis[cur-a]true; } mp[cur]--; } string ans; while(!st.empty()) { ans.push_back(st.top()); st.pop(); } reverse(ans.begin(),ans.end()); return ans; } };