将所有元素变为 0 的最少操作次数
问题描述
给定一个大小为 n 的非负整数数组 nums,我们需要通过若干次操作将数组中的所有元素变为 0。每次操作可以选择一个子数组 [i, j],将该子数组中所有最小的非负整数设为 0。目标是找到使整个数组变为 0 所需的最少操作次数。
关键思路
经过分析,发现这个问题可以通过单调栈高效解决。核心思路是:
-
维护一个单调递减栈,栈中元素表示需要单独处理的不同数值
-
当遇到比栈顶元素小的数字时,需要先处理掉栈顶元素(弹出并计数)
-
最终栈中剩余的元素也需要各自处理
算法实现
1 | class Solution: |
算法步骤详解
-
初始化:创建一个空栈和一个操作计数器
-
遍历数组:对于每个元素:
-
如果栈不为空且栈顶元素大于当前元素,弹出栈顶并增加操作计数
-
如果当前元素不为0且满足入栈条件(栈为空或栈顶不等于当前元素),将其压入栈中
-
-
处理剩余元素:将栈中剩余元素的数量加到操作计数中
-
返回结果:返回总操作次数
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!





