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 
    }
};
相关推荐
挺菜的9 分钟前
【算法刷题记录(简单题)003】统计大写字母个数(java代码实现)
java·数据结构·算法
mit6.8249 分钟前
7.6 优先队列| dijkstra | hash | rust
算法
2401_8582861143 分钟前
125.【C语言】数据结构之归并排序递归解法
c语言·开发语言·数据结构·算法·排序算法·归并排序
钱彬 (Qian Bin)1 小时前
一文掌握Qt Quick数字图像处理项目开发(基于Qt 6.9 C++和QML,代码开源)
c++·开源·qml·qt quick·qt6.9·数字图像处理项目·美观界面
guygg881 小时前
基于matlab的FIR滤波器
开发语言·算法·matlab
双叶8362 小时前
(C++)学生管理系统(正式版)(map数组的应用)(string应用)(引用)(文件储存的应用)(C++教学)(C++项目)
c语言·开发语言·数据结构·c++
源代码•宸2 小时前
C++高频知识点(二)
开发语言·c++·经验分享
ysh98882 小时前
PP-OCR:一款实用的超轻量级OCR系统
算法
遇雪长安2 小时前
差分定位技术:原理、分类与应用场景
算法·分类·数据挖掘·rtk·差分定位
数通Dinner2 小时前
RSTP 拓扑收敛机制
网络·网络协议·tcp/ip·算法·信息与通信