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

Kimi LeetCode 3911. 移除子数组元素后第 K 小偶数 Python3实现

以下是可直接在 LeetCode 提交的 Python3 完整实现,方法名已按题目要求使用 `kthRemainingInteger`:

```python
import bisect

class Solution:
def kthRemainingInteger(self, nums: list[int], queries: list[list[int]]) -> list[int]:
"""
对每个查询 [l, r, k]:
- 从无限正偶数序列 2,4,6,8,... 中移除子数组 nums[l..r] 里的偶数
- 返回剩余序列中第 k 小的偶数

核心思路:二分套二分
- 外层二分:假设答案是第 t 个正偶数(值为 2*t)
- 内层二分:统计子数组中值 <= 2*t 的偶数个数
- 验证:t - removed_count >= k 是否成立
"""

# 预处理:提取所有偶数的下标和值(nums 严格递增,故 even_val 也严格递增)
even_idx = [] # 偶数在原数组中的下标
even_val = [] # 偶数的值
for i, x in enumerate(nums):
if x % 2 == 0:
even_idx.append(i)
even_val.append(x)

m = len(even_val) # 全局偶数个数

def count_removed(l: int, r: int, t: int) -> int:
"""统计子数组 nums[l..r] 中值 <= 2*t 的偶数个数"""
# 步骤1:找到下标落在 [l, r] 范围内的偶数位置
left = bisect.bisect_left(even_idx, l)
right = bisect.bisect_right(even_idx, r)
if left >= right:
return 0

# 步骤2:在这些偶数中,值 <= 2*t 的个数(even_val 严格递增,可直接二分)
return bisect.bisect_right(even_val, 2 * t, left, right) - left

ans = []
for l, r, k in queries:
# 二分查找第 t 个正偶数
# 下界:k(至少第 k 个偶数)
# 上界:k + 全局偶数个数 + 余量(安全上界)
lo, hi = k, k + m + 2

while lo < hi:
mid = (lo + hi) // 2
removed = count_removed(l, r, mid) # 子数组中被移除的偶数个数
remaining = mid - removed # 前 mid 个偶数中剩余的个数

if remaining >= k:
hi = mid # 答案可能更小,收缩右边界
else:
lo = mid + 1 # 剩余不够,需要更大的 t

ans.append(2 * lo) # 第 t 个正偶数的值是 2*t

return ans
```

核心思路(二分套二分)

层次 作用
外层二分 对「第 t 个正偶数」二分。若前 t 个偶数(即 2,4,\dots,2t)中,未被移除的个数 \ge k,则答案 \le 2t。
内层二分 `count_removed` 先用 `bisect_left/right` 锁定子数组区间内的偶数位置,再用 `bisect_right` 统计其中值 \le 2t 的个数。
单调性 随着 t 增大,被移除的个数只增不减,因此「剩余个数 = t - \text{removed}」单调递增,保证二分正确。

复杂度

- 时间:O((n + q) \cdot \log m \cdot \log(k+m)),其中 n = \text{len(nums)},q = \text{len(queries)},m 为偶数总数。
- 空间:O(n),存储偶数下标和值。

验证结果

输入 输出
`nums=[1,4,7], queries=[[0,2,1],[1,1,2],[0,0,3]]` `[2, 6, 6]`
`nums=[2,5,8], queries=[[0,1,2],[1,2,1],[0,2,4]]` `[6, 2, 12]`
`nums=[3,6], queries=[[0,1,1],[1,1,3]]` `[2, 8]`

http://www.jsqmd.com/news/1397688/

相关文章:

  • Ubuntu终端复用实战:tmux与byobu提升开发运维效率
  • C++三角函数实战:从精度陷阱到性能优化全解析
  • 从“轻松玩“到“能开发“:Mesen 这款 NES 模拟器让红白机情怀满血复活
  • NCM 文件怎么转 MP3?ncmdump 一键解密,三种用法一次讲清
  • 【一手资讯】深圳全屋定制套餐价和实际落地价差多少? - 各行各业Ethan说
  • 抖音批量下载完整指南:从单视频到用户主页一键采集的实操手册
  • 免费解锁Wand专业版:Wand-Enhancer增强工具,一招搞定还能手机遥控
  • iOS越狱完整指南:从iOS 17到iOS 26.5的工具选择与兼容性实战手册
  • 数学建模论文实战指南:从模型构建到论文写作全流程解析
  • Qt开发:将UI文件编译为C++代码的原理与实践指南
  • Windows C盘空间清理全攻略:从原理到实战,安全释放几十GB
  • 2026长沙GEO推广公司实力横评:服务能力与落地效果决策参考 - 品牌品鉴馆
  • 2026年定形耐火材料制样设备厂家优选:金刚石钻样机/切割机/双端面磨床/干燥箱,硬核高效制样之选 - 卓企推荐
  • Nix 语言惰性特性揭秘:竟能让包管理器玩《超级马里奥兄弟 3》!
  • 北京医疗险拒赔律师李婷:专注各类保险合同纠纷维权 - 起跑123
  • XML Notepad 新手完整指南:微软官方免费 XML 编辑器从安装到进阶
  • 不装微信客户端怎么上微信?wechat-need-web 让微信网页版完整复活,免费简单三分钟搞定
  • Vue中localStorage的响应式封装与实战避坑指南
  • 最推荐远控软件评选,涵盖国内主流远控软件,谁适合所有人?
  • RAPR 驱动清理完整上手教程:摸清 Windows 驱动存储的家底,一次腾出 10GB 系统盘空间
  • 告别最终版.rar:从Git入门到实战,构建高效代码版本管理
  • 3分钟快速上手 ncmdump:网易云NCM格式转换免费工具完整指南
  • OpenClaw QQ机器人无响应?三步排查消息处理链路故障
  • 【第六篇】Java 基础排序算法:快速排序算法和堆排序
  • Kimi LeetCode 3911. 移除子数组元素后第 K 小偶数 Rust实现
  • Nucleus Co-op 本地分屏工具完整指南:3步让PC单机游戏变身多人同屏
  • 知网AIGC检测机制解析与学术写作应对策略
  • TVA-具身智能最新进展(21):打造情感状态与推理引擎
  • ApiFox调用接口前自动设置token
  • 从蓝屏到满血:SMUDebugTool搞定AMD Ryzen调优的6大实战场景