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

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

2个月前 (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)(栈最大容量)。掌握此类“栈+贪心”模型可高效解决类似数组调整问题,提升算法设计能力。


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣746:三步通关最小花费爬楼梯

力扣746:三步通关最小花费爬楼梯

题目解析:站在楼梯的某个台阶时,需要支付当前台阶对应的体力值cost[i],之后可以选择向上爬1或2个台阶。最终目标是到达‌楼层顶部‌(即数组末尾之后的位置),且初始位置可选择下标0或1的台阶作为起点...

力扣119题:从O(n²)到O(2n):杨辉三角高效空间优化

力扣119题:从O(n²)到O(2n):杨辉三角高效空间优化

题目重解:给定一个非负索引 rowIndex,返回杨辉三角的第 rowIndex 行。不同于生成整个杨辉三角,这道题要求我们只返回特定行,且空间复杂度应尽可能优化。例如输入3,需要返回[1,3,3,1...

力扣35:二分法在搜索插入位置中的运用

力扣35:二分法在搜索插入位置中的运用

有序数组的定位在一个严格递增的数字序列中,每个元素都有其确定的位置。当新元素试图加入时,我们需要回答两个问题:它是否已经存在?如果不存在,它应该插入在哪里?这道题要求我们在O(log n)时间内完成这...

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

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

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

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

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

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

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

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

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

发表评论

访客

看不清,换一张

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