当前位置: 首页 > news >正文

Kimi k2.6 LeetCode 2972. 统计移除递增子数组的数目 II Python3实现

以下是 LeetCode 2972. 统计移除递增子数组的数目 II 的 Python3 实现,采用双指针思路。

核心思路

1. 找最长递增前缀:从左边开始找到最长的严格递增前缀,末尾索引为 `i`
2. 找最长递增后缀:从右边开始找到最长的严格递增后缀,起始索引为 `startIndex`
3. 双指针枚举:枚举左前缀的结束位置,用双指针找到右后缀中第一个大于左前缀末尾的位置,计算可移除的子数组数量

如果整个数组已经严格递增,则任意子数组都是移除递增的,答案为 `n * (n + 1) // 2`。

Python3 代码

```python
from bisect import bisect_right
from typing import List

class Solution:
def incremovableSubarrayCount(self, nums: List[int]) -> int:
n = len(nums)

# 找到最长递增前缀的末尾索引
i = 0
while i + 1 < n and nums[i] < nums[i + 1]:
i += 1

# 如果整个数组严格递增,任意子数组移除后都递增
if i == n - 1:
return n * (n + 1) // 2

# 找到最长递增后缀的起始索引
startIndex = n - 1
while startIndex > 0 and nums[startIndex - 1] < nums[startIndex]:
startIndex -= 1

# 情况1:移除子数组包含整个后缀 [startIndex..n-1]
# 左前缀可以是 [0..0], [0..1], ..., [0..i] 以及空(移除整个数组)
# 共 i + 2 种(空前缀 + i+1 种非空前缀)
ans = i + 2

# 双指针:枚举左前缀结束位置 j,找右后缀中第一个 > nums[j] 的位置
j = startIndex
for left_end in range(startIndex):
# 左前缀必须严格递增,遇到非递增则停止
if left_end > 0 and nums[left_end] <= nums[left_end - 1]:
break

# 移动右指针,找到第一个 > nums[left_end] 的位置
while j < n and nums[j] <= nums[left_end]:
j += 1

# 可移除的子数组为 [left_end+1 .. k],其中 k 从 j-1 到 n-1
# 即移除子数组的右端点可以是 j-1, j, ..., n-1
# 共 n - j + 1 种
ans += n - j + 1

return ans
```

另一种实现(更简洁的双指针)

```python
from typing import List

class Solution:
def incremovableSubarrayCount(self, nums: List[int]) -> int:
n = len(nums)

# 找最长递增前缀末尾
i = 0
while i + 1 < n and nums[i] < nums[i + 1]:
i += 1

# 整个数组递增
if i == n - 1:
return n * (n + 1) // 2

# 找最长递增后缀起点
startIndex = n - 1
while startIndex > 0 and nums[startIndex - 1] < nums[startIndex]:
startIndex -= 1

ans = 0
j = startIndex

# left_end 从 -1 开始(表示空前缀)
for left_end in range(-1, startIndex):
if left_end >= 0:
# 左前缀必须严格递增
if left_end > 0 and nums[left_end] <= nums[left_end - 1]:
break
# 移动右指针
while j < n and nums[j] <= nums[left_end]:
j += 1

# 可移除子数组数量
ans += n - j + 1

return ans
```

关键点说明

要点 说明
递增前缀 `nums[0..i]` 是最长的严格递增前缀
递增后缀 `nums[startIndex..n-1]` 是最长的严格递增后缀
双指针 `left_end` 枚举左前缀结束位置,`j` 指向右后缀中第一个 `> nums[left_end]` 的位置
可移除子数组 对于固定的 `left_end`,移除子数组可以是 `[left_end+1 .. k]`,其中 `k ∈ [j-1, n-1]`,共 `n-j+1` 种
边界条件 `left_end = -1` 表示空前缀,即只保留右后缀

复杂度分析

- 时间复杂度:O(n),双指针每个位置最多访问一次
- 空间复杂度:O(1)

http://www.gsyq.cn/news/1463488.html

相关文章:

  • SWAT模型实战踩坑记:.sol文件为空、气象数据缺失?手把手教你诊断与修复
  • 新手福音:用快马平台生成练习项目,轻松理解github协作开发
  • 如何快速构建你的专属离线英语发音库:11万单词MP3音频一键下载指南
  • ContextMenuForWindows11开源项目:彻底解放你的右键菜单生产力
  • 别再乱改my.cnf了!MySQL 8.0+Docker大小写敏感问题的根治方案
  • 2026年近期潍坊行业知名的智能热水龙头生产商怎么选择?专业解析与推荐 - 2026年企业资讯
  • iFakeLocation终极指南:三步完成iOS虚拟定位的完整方案
  • 昌平区如何选购靠谱的近视防控眼镜? - mypinpai
  • 2026微信小程序商城平台深度解析:全链路选型与技术能力实测
  • 告别烂三角!用CGAL的isotropic_remeshing函数一键优化你的3D网格模型
  • hw八股准备
  • 如何用AI视觉技术彻底革新你的象棋学习体验:Vin象棋完整指南
  • 2026年新发布:青岛船员刷题软件机构如何选?这份指南请收好 - 2026年企业资讯
  • 2026年6月有实力的北京丙烷配送公司怎么选推荐榜,工业丙烷/高纯丙烷/焊割丙烷配送公司选择指南 - 海棠依旧大
  • 实战指南:基于快马平台生成RESTful API自动化测试脚本,保障接口质量
  • 2026无锡管道疏通避坑指南:选对专业、靠谱、口碑好公司的硬核逻辑!对维度对比。 - 极速版本
  • 从爱因斯坦求和到深度学习:揭秘张量运算中的‘黑话’(δij与erst符号保姆级解读)
  • OBS LocalVocal终极指南:3步实现本地AI语音识别字幕
  • Bobst 0704151202 NFC25-24T05-15控制器模块
  • 粉底液代加工多少钱,有哪些推荐厂商 - mypinpai
  • 中小企业转型:低成本、零服务器架构接入大模型的商业路径评估
  • 2026年6月评价高的无锡居民搬家公司哪家*榜:五大专业公司选择指南 - 海棠依旧大
  • AiFei 框架在机器人开发领域和边缘计算中的机遇
  • 探讨钢筋混凝土管定制生产的技巧 - mypinpai
  • 2026年现阶段,广东不锈钢圆球销售厂家综合实力深度解析 - 2026年企业资讯
  • 增长黑客实战:数据埋点设计、用户留存模型与转化率分析实践
  • 从Arduino到ATTINY13A:打造低功耗可穿戴彩虹灯徽章全解析
  • 报销合规性正在被AI重新定义:监管新规下,你的智能报销系统已存在3类未披露审计风险?
  • 雀魂牌谱分析工具:数据驱动的麻将水平提升指南
  • 从HL7Spy工具抓包到C#代码实现:手把手调试你的MLLP医疗数据接口