给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
- num 的长度小于 10002 且 ≥ k。
- num 不会包含任何前导零。
解题思路: 此题我一开始用DFS解题,近似暴力解法,看了一下num的长度达到 1 0 4 10^4 104,估计brute force解法会超时,所以没接着做了。然后参考网友Grandyang,此题考查单调栈,因此只需要维护一个单调栈即可,在访问完字符串后,单调栈中的元素即为所求最小值。
class Solution {
public:
string removeKdigits(string num, int k) {
string res;
int n = num.size(), keep = n - k;
for (char c : num) {
while (k && res.size() && res.back() > c) {
res.pop_back();
--k;
}
res.push_back(c);
}
res.resize(keep);
while (!res.empty() && res[0] == '0') res.erase(res.begin());
return res.empty() ? "0" : res;
}
};
注:单调栈
LeetCode中有好几种类型的题用到了单调栈
- 给定一个序列,求序列的每个元素后面刚好大于它的值