zoukankan      html  css  js  c++  java
  • 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;
        }
    };
  • 相关阅读:
    scss的初级学习随笔小计
    trimpash实现jd选项卡首次输入
    透明度动画
    js原生动画一匀速动画
    filter滤镜的使用
    scss实现不同方向的三角
    模板方法模式-考题抄错,会做也白搭
    设计模式概述
    mysql数据库
    夜饮东坡醒复醉
  • 原文地址:https://www.cnblogs.com/qingjiuling/p/13976348.html
Copyright © 2011-2022 走看看