LeetCode 402
https://leetcode.cn/problems/remove-k-digits/description/
难度:中等
高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/
本题需要尽量保证前面的数字最小,这可以使用单调栈来实现。
我们定义一个单调栈,遍历整个数字,当 k > 0 时,对于当前数字,判断是否小于栈顶,否则弹出栈顶元素。这样最后从栈底到栈顶单调不减。
如果最后 k 还是 > 0,那么直接删除最后的 k - m 个元素,因为他们是最大的。
为了生成答案,需要从栈底到栈顶遍历,因此栈使用 vector 来实现。
时间复杂度:O(n),其中 n 为字符串的长度。
空间复杂度:O(n)。栈存储数字需要线性的空间。
class Solution {
public:
string removeKdigits(string num, int k) {
vector<char> stk;
for (char digit: num) {
while (k > 0 && !stk.empty() && digit < stk.back()) {
stk.pop_back();
k--;
}
stk.push_back(digit);
}
while (k > 0) {
stk.pop_back();
k--;
}
string ans = "";
bool is_leading_zero = true;
for (auto digit : stk) {
if (is_leading_zero && digit == '0') {
continue;
}
is_leading_zero = false;
ans += digit;
}
return ans == "" ? "0" : ans;
}
};