提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
单调栈在LeetCode题目中的使用
前言
在解决LeetCode402移掉K位数字时遇到了问题,在仔细查看其他人的题解后了解到了栈的新用法——单调栈。在之前的使用过程中,我对栈的理解就是可以正序输入倒序输出,而如果使用单调栈就可以形成一个单调递增或者递减的数据结构,在解决一些问题的时候会非常轻松。
提示:以下是本篇文章正文内容,下面案例可供参考
一、单调栈是什么?
顾名思义,就是单调递增或者单调递减的栈结构。因为只对栈顶数据进行插入和删除,因此在比较相邻元素的题目中非常有用。
二、使用单调栈解决具体问题
LeetCode402. 移掉K位数字
思路
将num逐位输入单调栈中,如果栈顶数字比即将输入的大就弹出,直到栈顶是目前最小的数字。这里使用的原理:两个位数相同的数字,第一位不同的数字的大小决定了这两个数字的大小(有点绕,可以自己好好想一想,比如a=15xx,b=16xx,那么b>a)。
c++实现
代码如下:
class Solution {
public:
string removeKdigits(string num, int k) {
int amount = num.size() - k;
string res = "";
if (num.size() == k)
{
res = res + '0';
return res;
}
stack<char> s;
s.push(num[0]);
for (int i = 1; i < num.size(); i++)
{
if (k == 0) { s.push(num[i]); }
else
{
while ((!s.empty()) && (s.top() > num[i]) && (k > 0))
{
s.pop();
k--;
}
s.push(num[i]);
}
}
while (s.size() > amount) { s.pop(); }
for (int i = s.size(); i > 0; i--)
{
res = s.top() + res;
s.pop();
}
while (res[0] == '0')
{
res = res.substr(1, res.size() - 1);
}
if (res.empty()) { res = "0"; }
return res;
}
};