news 2026/6/30 22:44:19

Kimi LeetCode 3420. 统计 K 次操作以内得到非递减子数组的数目 C++实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kimi LeetCode 3420. 统计 K 次操作以内得到非递减子数组的数目 C++实现

以下是 LeetCode 3420. 统计 K 次操作以内得到非递减子数组的数目 的 C++ 实现。

---

解题思路

这道题的核心是 从右往左滑动窗口 + 单调队列,时间复杂度 O(n),空间复杂度 O(n)。

关键观察

1. 单调性:如果一个子数组 `[i, j]` 可以在 `k` 次操作内变为非递减,那么它的所有子数组(如 `[i+1, j]`、`[i, j-1]` 等)也一定可以。这满足了双指针的单调性条件。

2. 为什么从右往左? 从左往右扩展窗口时,移除左边元素会影响右边元素的"依赖关系",处理极其复杂。而从右往左时,新元素在左边,只会影响右边已在窗口中的元素,"加边"操作比"删边"简单得多。

3. 单调队列的作用:队列中存储的是 `<数值, 个数>` 对,按数值非递增排列。它表示当前窗口在调整为非递减后,每个"平台"的高度和覆盖的原始元素个数。
- 当新元素 `num` 进入窗口时,它会"吸收"队列尾部所有比它小的平台(因为这些平台必须被提升到至少 `num` 的高度才能非递减)。
- 操作次数增加量 = `(num - 小平台高度) × 小平台元素个数`。

4. 窗口收缩:当操作次数超过 `k` 时,从右侧移除元素。最右侧的元素被恢复为原始值,操作次数相应减少。

---

C++ 完整代码

```cpp
#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
long long countNonDecreasingSubarrays(vector<int>& nums, int k) {
long long ans = 0;
long long cost = 0;

// 单调队列:存储 <数值, 个数> 对,按数值非递增顺序排列
deque<pair<int, long long>> dq;

// i: 窗口左端点(从右往左移动)
// j: 窗口右端点(只会向左收缩)
for (int i = nums.size() - 1, j = nums.size() - 1; i >= 0; --i) {
const int num = nums[i];
long long count = 1;

// 新元素 num 进入窗口,吸收队列尾部比它小的平台
while (!dq.empty() && dq.back().first < num) {
auto [nextNum, nextCount] = dq.back();
dq.pop_back();
count += nextCount;
cost += static_cast<long long>(num - nextNum) * nextCount;
}

dq.emplace_back(num, count);

// 操作次数超限,从右侧缩小窗口
while (cost > k) {
auto [rightmostNum, rightmostCount] = dq.front();
dq.pop_front();
cost -= static_cast<long long>(rightmostNum - nums[j]);
j--;
if (rightmostCount > 1) {
dq.emplace_front(rightmostNum, rightmostCount - 1);
}
}

// 以 i 为左端点,[i, j] 范围内的所有子数组都满足条件
ans += j - i + 1;
}

return ans;
}
};
```

---

测试验证

输入 输出 说明
`nums = [6,3,1,2,4,4], k = 7` `17` 21 个子数组中 4 个不满足
`nums = [6,3,1,3,6], k = 4` `12` 官方示例 2
`nums = [5], k = 0` `1` 单元素天然非递减
`nums = [1,2,3,4,5], k = 0` `15` 已非递减,全部满足
`nums = [5,4,3,2,1], k = 100` `15` k 足够大,全部满足
`nums = [10,1,1,1], k = 2` `7` k 很小的情况

下载完整代码:[leetcode_3420.cpp](sandbox:///mnt/agents/output/leetcode_3420.cpp)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/30 22:42:08

防火墙Web界面配置一对一IPSec隧道:从原理到实战详解

1. 项目概述&#xff1a;为什么需要一对一IPSec隧道&#xff1f;在网络安全领域&#xff0c;防火墙作为内外网之间的“守门人”&#xff0c;其重要性不言而喻。而IPSec&#xff08;Internet Protocol Security&#xff09;协议&#xff0c;则是保障数据在公共网络上&#xff08…

作者头像 李华
网站建设 2026/6/30 22:40:21

免费的Windows硬件检测工具合集,101款检测工具一站集齐,小白也能轻松上手 图吧工具箱Win UI3版

大家好&#xff0c;我是老王。专注做资源整合搜集的老油条。 平时帮朋友看电脑&#xff0c;最怕遇到缺工具。最近我看到一款GitHub开源免费的硬件检测工具——图吧工具箱 Win UI3版&#xff0c;感觉挺省事。它内置超过101款实用工具&#xff0c;从处理器、内存、显卡到显示器、…

作者头像 李华
网站建设 2026/6/30 22:35:58

TVA在具身智能全栈能力体系中的关键作用(系列)

前沿技术介绍&#xff1a;AI智能体视觉&#xff08;TVA&#xff0c;Transformer-based Vision Agent&#xff09;是依托Transformer架构与“因式智能体”理论所构建的颠覆性工业视觉技术&#xff0c;属于“物理AI” 领域的一种全新技术形态&#xff0c;完成了从“虚拟世界”到“…

作者头像 李华
网站建设 2026/6/30 22:33:00

07_ESP32物联网开发

ESP32物联网开发:Wi-Fi、蓝牙与传感器全实战 一、ESP32概述与开发环境搭建 1.1 什么是ESP32 ESP32是乐鑫科技(Espressif Systems)推出的一款高性能、低功耗的物联网芯片。ESP32集成了Wi-Fi和蓝牙功能,具有强大的处理能力和丰富的外设资源,是物联网开发的理想选择。 ES…

作者头像 李华