当前位置:首页 > 力扣 > LeetCode 3542题:单调栈优化最小操作次数问题

LeetCode 3542题:单调栈优化最小操作次数问题

1个月前 (08-07)

LeetCode 3542题:单调栈优化最小操作次数问题 单调栈 C++ 贪心策略 力扣题解 第1张

一、题目解读

LeetCode 3527题要求对给定数组进行操作,通过一系列步骤将其调整为特定状态(或满足特定条件)。题目核心在于通过最小操作次数实现目标,通常涉及数组元素顺序调整或状态转换。理解题目约束条件(如元素限制、操作定义)是解题关键。

二、解题思路

采用“单调栈+贪心策略”求解。核心思想是维护一个单调递增,通过入栈/出栈操作确保栈内元素严格递增。每次遍历数组元素时,若当前元素破坏栈单调性,则弹出栈顶元素直至恢复单调;当栈为空或当前元素需新增操作时,计数加一。此策略保证每一步操作均为必要且最优,避免冗余调整。

三、解题步骤

1. 初始化结果res=0,创建单调递增栈stk。

2. 遍历数组nums:

○ 若栈不空且栈顶>当前元素,持续弹出栈顶(消除“逆序”元素)。

○ 若当前元素num≠0且栈空或栈顶<num,执行新增操作(res++)并入栈。

3. 返回最终操作次数res。

步骤关键:通过“逆序弹出”维护单调性,仅当“必要新增”时才计入操作,确保全局最优解。

四、代码与注释

class Solution {
public:
    int minOperations(vector<int>& nums) {
        int res = 0;
        stack<int> stk;

        for (int num : nums) {
            // 维护单调递增栈
            while (!stk.empty() && stk.top() > num) {
                stk.pop();
            }

            // 只有当当前数字不为0且栈为空或栈顶小于当前数字时才需要增加操作次数
            if (num != 0 && (stk.empty() || stk.top() < num)) {
                res++;
                stk.push(num);
            }
        }

        return res;
    }
};

代码注释解析:

● 循环逻辑紧扣“单调性维护”与“新增操作判定”,通过条件分支精准捕捉必要步骤。

● 栈操作与计数逻辑紧密耦合,避免重复或无效调整。

五、总结

本题通过单调栈将复杂操作序列转化为局部最优决策,核心在于识别“必须新增”与“可消除”的两种情况。算法时间复杂度O(n)(单次遍历+栈操作),空间复杂度O(n)(栈最大容量)。掌握此类“栈+贪心”模型可高效解决类似数组调整问题,提升算法设计能力。


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣94:递归之美 轻松掌握二叉树中序遍历

力扣94:递归之美 轻松掌握二叉树中序遍历

题目解读二叉树的中序遍历是一种基础且重要的树遍历方式,其遍历顺序为:先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。对于二叉搜索树,中序遍历的结果恰好是节点值的升序排列。给定一个二叉...

【动态规划入门】力扣509题:斐波那契数列的经典解法与优化思路

【动态规划入门】力扣509题:斐波那契数列的经典解法与优化思路

题目解读‌斐波那契数列是一个经典的数学问题,在计算机科学中常被用作算法教学的入门案例。这个神奇的数列从0和1开始,后续每个数字都是前两个数字之和。题目要求我们计算第n个斐波那契数,看似简单的问题背后却...

手搓顺序表类代码注释与详解:从零实现动态数组(新手教程)

一、简介和特点顺序表(Sequential List)是数据结构中基础的一种线性表,其特点是将数据元素存储在连续的内存空间中。通过数组实现,支持随机访问(即通过索引直接访问元素),适用于频繁随机读取的...

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

一、题目解读洛谷B3617题要求将输入的八进制字符串转换为十六进制表示。题目需处理大数场景,且对输入合法性有明确限制(长度不超过1000,仅包含0-7字符)。由于八进制与十六进制无法直接转换,需借助十...

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

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

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

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

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

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

发表评论

访客

看不清,换一张

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