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

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

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


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣198.打家劫舍|动态规划解法中的特殊边界处理

力扣198.打家劫舍|动态规划解法中的特殊边界处理

题意解析:在排列成直线的房屋群中,每个房屋藏有价值不同的财物。小偷不能连续抢劫相邻的两间房屋,否则会触发警报。我们需要设计一套抢劫策略,使得在不触发警报的前提下,能够获取的最大财物总和。这个问题本质上...

力扣654:递归分治的艺术 如何用最大元素构建二叉树

力扣654:递归分治的艺术 如何用最大元素构建二叉树

题目重解我们面对一个看似简单却充满递归魅力的题目:给定一个不含重复元素的整数数组,需要构建一棵特殊的二叉树。这个树的每个父节点都必须是当前子数组中的最大元素,而它的左右子树则分别由该最大值左侧和右侧的...

力扣933题:队列的妙用:如何高效统计最近请求

力扣933题:队列的妙用:如何高效统计最近请求

题目重解:我们需要设计一个能统计最近3000毫秒内请求次数的系统。每当新的请求到来时,它会带有时间戳t,我们需要返回过去3000毫秒内(包括当前)发生的请求总数。这就像是在时间轴上维护一个滑动窗口,只...

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

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

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

力扣965题深度解析:单值二叉树的判断技巧

力扣965题深度解析:单值二叉树的判断技巧

重新解读题目 判断一棵二叉树是否为“单值二叉树”,即所有节点的值是否完全相同。题目看似简单,实则考验对树结构递归特性的理解。若一棵树的所有节点值相同,其必然满足:根节点与左右子树的值一致,且...

力扣第44题:寻找两个正序数组的中位数 - 合并排序解法详解

力扣第44题:寻找两个正序数组的中位数 - 合并排序解法详解

内容简介本文详细解析了力扣第44题"寻找两个正序数组的中位数"的合并排序解法。通过双指针技术合并两个有序数组,然后直接计算合并后数组的中位数。虽然时间复杂度为O(m+n),但这种方...

发表评论

访客

看不清,换一张

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