题目描述:
给你一个以字符串表示的非负整数 num
和一个整数 k
,移除这个数中的 k
位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。
示例 1 :
输入:num = "1432219", k = 3
输出:"1219"
解释:移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219 。
解析:本题可采用贪心+单调栈的方法进行解决。
我们知道,一个多位数字越左边的数越小,则该数越小,例如:1234<1134 , 3123<2123。
因此对于这道题目,我们只需要保证左边的数字较小,就可以确保最后的答案是最小的,靠右数字的大小,对本题的答案没有影响。
对于每次执行,我们要确保删除一个靠左的、较大的数字。我们可以构造一个单调栈,让每一位数字A都进入栈,并且与栈顶的数字进行比较,如果A比栈顶数字更小,那么弹出栈顶数字,重复进行上述操作,直至栈顶数字小于等于A或栈顶为空或弹出数字的数量达到了最大值K。
对所有数字进行以上操作后,我们已经可以确保靠左边的数字为最优解,如果此时删去数字的数量还未达到K,则删去末尾的数字,直至数量满足要求。
代码:
class Solution {
public:
string removeKdigits(string num, int k) {
vector<char> ans;
for(auto& digit: num){
while(ans.size()>0&&ans.back()>digit&&k){
ans.pop_back();
k-=1;
}
ans.push_back(digit);
}
for(;k>0;--k){
ans.pop_back();
}
string t="";
bool iszero=true;
for(auto& digit: ans){
if(iszero&&digit=='0'){
continue;
}
iszero=false;
t+=digit;
}
return t == "" ? "0" : t;
}
};