leetcode 402. 移掉 K 位数字

题目如下

数据范围

复制代码
    本题可以利用贪心来做,显然我们的目标是使得结果串尽量小,  当两个字符串长度相等时靠前的字符越小整个串越小。
例如"1243" k = 1删除4就行,因为剩下的串长度为3最小的自然是 "123" 。
从这里我们可以感觉到其实我们是要让结果串呈现一种递增的态势这样可以保证是所有结果串中最小的。
那么我们可以维持一个递增序列,这个序列就用来保存需要作为答案的下标。显然可以用单调栈来获得这样的序列。
!注意:当题目给出的原本就是递增的只要删除后面k个即可例如: "12345" k = 1 删除5就可以得到最优解。

通过代码

cpp 复制代码
class Solution {
public:
    string removeKdigits(string num, int k) {
        string ans = "";
        int n = num.size();
        if(n <= k)return "0";
        unordered_set<int> set;
        stack<int> s;
        for(int i = 0;i < n;i++){
            while(!s.empty() && num[s.top()] > num[i]){
                if(k == 0)break;
                set.insert(s.top());
                s.pop();
                k--;
            }
            s.push(i);
        }
        for(int i = 0;i < k;i++){
             set.insert(s.top());
                s.pop();
        }
        for(int i = 0;i < n;i++){
            if(!set.contains(i)){
                if(num[i] == '0' && ans.size() == 0)continue;
                ans += num[i] ;
            }
        }
        if(ans.size() == 0)return "0";
        return ans;//时间复杂度On 
    }
};
相关推荐
宠..几秒前
VS Code SSH 远程连接 Ubuntu 并实现快速运行(C/C++示例)
java·运维·c语言·开发语言·c++·ubuntu·ssh
WL_Aurora2 分钟前
Python 算法基础篇之排序算法(二):希尔、快速、归并
python·算法·排序算法
闻缺陷则喜何志丹8 分钟前
【图论 树 启发式合并】P7165 [COCI2020-2021#1] Papričice|普及+
c++·算法·启发式算法·图论··洛谷
alexwang21110 分钟前
AT_abc458_d [ABC458D] Chalkboard Median题解
c++·算法·题解·atcoder
故事和你9110 分钟前
洛谷-【图论2-4】连通性问题1
开发语言·数据结构·c++·算法·动态规划·图论
我先去打把游戏先18 分钟前
Ubuntu虚拟机(服务器版本)Git安装教程(附常用命令)——从零开始掌握版本控制
服务器·c语言·c++·git·嵌入式硬件·物联网·ubuntu
周末也要写八哥20 分钟前
算法实例分析:使数组相等的最小开销
算法
吃好睡好便好23 分钟前
在Matlab中绘制质点运动轨迹图
开发语言·学习·算法·matlab·信息可视化
艾莉丝努力练剑24 分钟前
【Linux网络】Linux 网络编程:HTTP(四)从手写服务器到生产级 Nginx 与 cpp-httplib 实战
linux·运维·服务器·网络·c++·nginx·http
爱炼丹的James26 分钟前
第三章 搜索和图论
数据结构·算法·图论