20.11.15 leetcode402
题目链接:https://leetcode-cn.com/problems/remove-k-digits/
题意:给一个用字符串表示的数字,你可以从中任意删减k个字符,使其字母序最小。
分析:字母序最小就得让前面的数字尽可能小,我最开始的想法是,对于第一个字符,从第二个开始向其后遍历k个字符,如果这k个字符中有比第一个字符小的字符i,就从第一个开始到i-1全部删掉,然后再重复这个过程;如果k个字符中没有比第一个小的字符,就过渡到第二个字符,从第二个字符重新开始这个过程。很明显,这就是纯粹的暴力,写起来麻烦而且时间复杂度可能达到O(nk)。
题解给的方法是利用单调栈,从前往后扫数字字符串,如果有遇到比当前栈顶小的,就把栈顶的移出栈,把这个更小的压进栈,移出操作最多k次,这里之所以不用stack是因为stack取出来是倒的麻烦。
class Solution { public: string removeKdigits(string num, int k) { vector<char> stk; for(auto& v : num){ while(stk.size()>0&&k&&v<stk.back()){ stk.pop_back(); k--; } stk.push_back(v); } while(k){ stk.pop_back(); k--; } string ans=""; bool flag=1; for(auto& v : stk){ if(flag&&v=='0'){ continue; } flag=0; ans+=v; } return ans==""?"0":ans; } };