尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Kimi LeetCode 3525. 求出数组的 X 值 II Python3实现

Kimi    LeetCode 3525. 求出数组的 X 值 II Python3实现
📅 发布时间:2026/7/10 10:06:20

以下是 LeetCode 3525 求出数组的 X 值 II 的 Python3 实现,核心思路是线段树维护区间前缀积的模分布。

思路概述

- 对于每个查询,先单点修改 `nums[index]`,再移除前缀保留 `[start..]`,最后可以删除任意后缀(即保留任意非空前缀)。
- 因此每个查询的答案等价于:在子数组 `nums[start..]` 的所有非空前缀中,乘积模 `k` 等于 `x` 的个数。
- 由于 `k ≤ 5`,线段树每个节点只需维护:
- `prod`:区间整体乘积模 `k`
- `cnt`:`cnt[m]` 表示该区间内,有多少个非空前缀的乘积模 `k` 等于 `m`
- 合并两个子区间时,右子树的前缀需要乘上左子树的总积再模 `k`。

复杂度

- 时间:`O((n + q) · k² · log n)`,由于 `k ≤ 5`,实际约为 `O((n + q) log n)`
- 空间:`O(n)`

完整代码

```python
class Node:
__slots__ = ('prod', 'cnt')
def __init__(self):
self.prod = 1 # 区间乘积 % k
self.cnt = [0] * 5 # cnt[m] = 非空前缀中乘积 % k == m 的个数

class SegTree:
def __init__(self, nums, k):
self.n = len(nums)
self.k = k
self.tree = [Node() for _ in range(self.n * 4)]
self.build(1, 0, self.n - 1, nums)

def build(self, node, l, r, nums):
if l == r:
v = nums[l] % self.k
self.tree[node].prod = v
self.tree[node].cnt = [0] * 5
self.tree[node].cnt[v] = 1
return
mid = (l + r) >> 1
self.build(node << 1, l, mid, nums)
self.build(node << 1 | 1, mid + 1, r, nums)
self.pull(node)

def merge(self, left, right):
res = Node()
res.prod = (left.prod * right.prod) % self.k

# 左区间的前缀直接保留
for i in range(self.k):
res.cnt[i] += left.cnt[i]

# 右区间的前缀需要乘上左区间的总积
for i in range(self.k):
if right.cnt[i]:
new_mod = (left.prod * i) % self.k
res.cnt[new_mod] += right.cnt[i]

return res

def pull(self, node):
self.tree[node] = self.merge(self.tree[node << 1], self.tree[node << 1 | 1])

def update(self, node, l, r, idx, val):
if l == r:
v = val % self.k
self.tree[node].prod = v
self.tree[node].cnt = [0] * 5
self.tree[node].cnt[v] = 1
return
mid = (l + r) >> 1
if idx <= mid:
self.update(node << 1, l, mid, idx, val)
else:
self.update(node << 1 | 1, mid + 1, r, idx, val)
self.pull(node)

def query(self, node, l, r, ql, qr):
if ql <= l and r <= qr:
return self.tree[node]
mid = (l + r) >> 1
if qr <= mid:
return self.query(node << 1, l, mid, ql, qr)
if ql > mid:
return self.query(node << 1 | 1, mid + 1, r, ql, qr)
left = self.query(node << 1, l, mid, ql, qr)
right = self.query(node << 1 | 1, mid + 1, r, ql, qr)
return self.merge(left, right)

class Solution:
def resultArray(self, nums: List[int], k: int, queries: List[List[int]]) -> List[int]:
n = len(nums)
# 预处理:所有数先对 k 取模
nums = [x % k for x in nums]

seg = SegTree(nums, k)
ans = []

for q in queries:
idx, val, start, x = q
val %= k
seg.update(1, 0, n - 1, idx, val)
res = seg.query(1, 0, n - 1, start, n - 1)
ans.append(res.cnt[x])

return ans
```

关键点说明

1. `cnt` 的含义:每个节点维护的是从该区间左端点开始的所有非空前缀的模分布。这样查询任意子区间时,递归返回的子节点天然满足"从左端点开始"的要求,合并时只需把右子树的前缀乘上左子树的总积即可。
2. `k ≤ 5` 的利用:`cnt` 数组固定开 5,实际只用前 `k` 个;合并时的双重循环最多 25 次运算,常数极小。
3. 单点更新:修改叶子后自底向上 `pull`,保持每个节点的 `prod` 和 `cnt` 正确。
4. 预处理取模:建树前和更新时都把数值对 `k` 取模,避免大数运算。

相关新闻

  • Muse Image:基于扩散模型的社交媒体图像生成技术解析
  • shell环境变量
  • 2026年7月最新泉州天梭官方售后客户服务电话及线下网点地址 - 天梭服务中心

最新新闻

  • STM32C552定时器输入捕获实现高精度频率测量技术详解
  • Noah-MP陆面过程模型建模方法与站点、区域模拟技术
  • Python-docx 批量处理 Word 文档:3 步自动识别并格式化 JSON 代码块
  • 五声调式音程关系解析:3个大二度与2个小三度的听觉密码
  • 邢台黄金回收安全透明渠道汇总|2026 年 7 月实时大盘金价,襄都 / 信都 / 任泽 24 小时上门实体门店白名单 - 不晚生活号
  • Altium Designer 24 高速PCB布线:5步完成阻抗控制与差分对长度匹配

日新闻

  • OpenClaw本地化部署:xParse文档解析引擎实战指南
  • 蓝牙 5.4 协议栈深度解析:从 HCI 到 L2CAP 的 7 层数据流
  • PyTorch nn.CrossEntropyLoss 实战:3种权重设置与标签平滑对比(附代码)

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号