当前位置:首页 > 洛谷 > 洛谷P1106题【删除K个数字得到最小数】解题思路与C++代码详解

洛谷P1106题【删除K个数字得到最小数】解题思路与C++代码详解

2个月前 (09-23)

洛谷P1106题【删除K个数字得到最小数】解题思路与C++代码详解 洛谷题解 栈结构 单调栈 C++ 第1张

一、题目解读

洛谷P1106题要求给定一个数字串num和整数k,通过删除num中的k个数字,得到一个最小的可能结果。题目需注意处理前导零(如删除后全为0需返回"0")及数字串本身的非负特性。核心在于如何在删除操作中保持数字顺序并最小化结果。

二、解题思路

采用单调栈优化策略:

1. 维护一个单调递增的,从num左到右遍历数字。

2. 若栈顶数字大于当前数字且k未用完,则弹出栈顶(删除较大数),直至栈顶小于等于当前数字或k耗尽。

3. 遍历结束后,若k仍有剩余,从栈末尾删除对应数字(末尾数字对结果影响最小)。

4. 去除栈中元素构成的新串的前导零,确保结果合法。

三、解题步骤

1. 初始化:创建栈存储数字,k记录剩余删除次数。

2. 遍历数字串:

○ 若栈不空且栈顶>当前数字且k>0,弹出栈顶并k减1。

○ 将当前数字入栈。

3. 处理剩余k:若k未耗尽,从栈末尾弹出对应元素。

4. 构建结果:去除前导零后拼接栈中元素,空串则返回"0"。

四、代码与注释

#include <iostream>
#include <string>
#include <vector>
using namespace std;

// 删除k个数字得到最小数
string removeKDigits(string num, int k) {
    vector<char> stack;  // 单调栈,存储递减序列
    
    for (char digit : num) {  // 遍历数字串
        while (!stack.empty() && k > 0 && stack.back() > digit) {  // 若栈顶大于当前数字且可删除
            stack.pop_back();  // 弹出栈顶(删除较大数)
            k--;
        }
        stack.push_back(digit);  // 当前数字入栈
    }
    
    while (k-- > 0) {  // 处理剩余k:末尾删除
        stack.pop_back();
    }
    
    string result;
    bool leadingZero = true;  // 标记前导零
    for (char digit : stack) {
        if (leadingZero && digit == '0') continue;  // 跳过前导0
        leadingZero = false;
        result += digit;
    }
    return result.empty()? "0" : result;  // 空串返回0
}

int main() {
    string num;
    int k;
    cin >> num >> k;
    cout << removeKDigits(num, k) << endl;
    return 0;
}

五、总结

本解法通过单调栈巧妙地将删除操作转化为栈维护问题,核心逻辑在于“优先删除较大的数字以保留较小数字的左侧位置”,时间复杂度O(n),适用于需优化数字序列的算法场景。需特别注意前导零处理以避免结果错误。


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣1221:一次扫描解决分割平衡字符串 时间O(n)空间O(1)

力扣1221:一次扫描解决分割平衡字符串 时间O(n)空间O(1)

题目重解给定一个仅包含'L'和'R'的字符串,要求将其分割成尽可能多的子串,且每个子串中'L'和'R'的数量相等。例如输入"R...

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

题目重解给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们的目标是找到一条路径,使得路径上经过的数字总和最大。这个问题在实际中有许多应用场景,如最优路径规划、...

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

题目重解:数字三角形是一个经典的动态规划问题,给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们需要找到一条路径,使得路径上经过的数字总和最大。这个问题可以很...

力扣540题:线性扫描法如何高效定位唯一数

力扣540题:线性扫描法如何高效定位唯一数

题目重解一个严格递增的有序数组中,除某个元素外,其余每个元素均出现两次。这个看似简单的条件背后隐藏着巧妙的规律——单一元素会打破数组的"成对对称性"。题目要求以O(log n)时间...

牛客14496题解:括号最大深度问题(栈思想与代码优化)

牛客14496题解:括号最大深度问题(栈思想与代码优化)

一、题目解读牛客14496题要求计算给定括号字符串中的最大深度。例如,对于字符串 "(()())",最大深度为2。题目考察对括号嵌套结构的理解,以及如何通过编程找到最深嵌套层次。二...

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。