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;
    }
};
原文地址:https://www.cnblogs.com/qingjiuling/p/13976348.html