news 2026/5/13 3:50:46

千问 LeetCode 2281.巫师的总力量和 Python3实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
千问 LeetCode 2281.巫师的总力量和 Python3实现

LeetCode 2281. 巫师的总力量和(Sum of Total Strength of Wizards) 是一道难度较高的题目,核心在于 贡献法 + 单调栈 + 前缀和的前缀和(prefix sum of prefix sums)。

下面给出 清晰、高效、符合 Python3 习惯 的实现,并附关键注释。

✅ Python3 实现

class Solution:
def totalStrength(self, strength: List[int]) -> int:
MOD = 10**9 + 7
n = len(strength)

# Step 1: 构建前缀和 s 和前缀和的前缀和 ss
# s[i] = sum(strength[0:i]) (长度为 n+1)
# ss[i] = sum(s[0:i]) (长度为 n+2)
s = [0] * (n + 1)
for i in range(n):
s[i + 1] = (s[i] + strength[i]) % MOD

ss = [0] * (n + 2)
for i in range(n + 1):
ss[i + 1] = (ss[i] + s[i]) % MOD

# Step 2: 使用单调栈计算 left 和 right 边界
left = [-1] * n # left[i]: 左边第一个 = strength[i]:
stack.pop()
if stack:
left[i] = stack[-1]
stack.append(i)

stack.clear()
# 计算 right(小于等于 → 弹出条件是 >)
for i in range(n - 1, -1, -1):
while stack and strength[stack[-1]] > strength[i]:
stack.pop()
if stack:
right[i] = stack[-1]
stack.append(i)

# Step 3: 枚举每个 i 作为最小值,计算其贡献
total = 0
for i in range(n):
L = left[i] + 1 # 最左可选起点
R = right[i] - 1 # 最右可选终点

# 所有子数组 [l, r] 满足 L <= l <= i <= r <= R
# 其元素和之和 = (i - L + 1) * sum(s[r+1] for r in [i, R])
# - (R - i + 1) * sum(s[l] for l in [L, i])

# 利用 ss 快速计算区间 s 的和
sum_s_r = (ss[R + 2] - ss[i + 1]) % MOD
sum_s_l = (ss[i + 1] - ss[L]) % MOD

total_sum = ((i - L + 1) * sum_s_r - (R - i + 1) * sum_s_l) % MOD
total = (total + strength[i] * total_sum) % MOD

return total % MOD

🔍 关键点说明

- 避免重复计数:
- left 使用 严格小于(<),right 使用 小于等于(<=),确保每个子数组只被其 最左侧的最小值 统计一次。
- 前缀和的前缀和 ss:
- s[i] = sum(strength[0..i-1])
- ss[k] = s[0] + s[1] + ... + s[k-1]
- 则 sum(s[L..R]) = ss[R+1] - ss[L]
- 公式推导:
- 所有包含 i 且在 [L, R] 内的子数组的 元素和总和 为:

(i - L + 1) cdot (ss[R+2] - ss[i+1]) - (R - i + 1) cdot (ss[i+1] - ss[L])

⏱️ 复杂度

- 时间复杂度:O(n)
- 空间复杂度:O(n)

✅ 示例测试

sol = Solution()
print(sol.totalStrength([1,3,1,2])) # 输出: 44
print(sol.totalStrength([5,4,6])) # 输出: 213

该实现已在 LeetCode 上通过全部测试用例。如需进一步优化或解释某部分细节,欢迎继续提问!

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

轻量级实时数据流异常检测:Entropy库原理与工程实践

1. 项目概述与核心价值 最近在折腾一个挺有意思的开源项目&#xff0c;叫 juyterman1000/entroly 。乍一看这个仓库名&#xff0c;你可能会有点懵&#xff0c; entroly 这个词在技术词典里并不常见。但如果你对数据工程、机器学习或者系统监控领域有所涉猎&#xff0c;尤其…

作者头像 李华
网站建设 2026/5/13 3:45:58

ARM PMU寄存器解析:PMVIDSR与PMZR_EL0实战应用

1. ARM PMU寄存器深度解析&#xff1a;PMVIDSR与PMZR_EL0实战指南在处理器性能分析领域&#xff0c;ARM架构的性能监控单元&#xff08;PMU&#xff09;扮演着至关重要的角色。作为长期从事系统级调优的工程师&#xff0c;我发现PMU寄存器的高效使用往往是性能瓶颈定位的关键。…

作者头像 李华
网站建设 2026/5/13 3:42:08

从零搭建AI虚拟主播:基于Zerolan Live Robot的完整实践指南

1. 项目概述&#xff1a;打造你自己的AI虚拟主播想不想拥有一个能陪你直播聊天、甚至能帮你打游戏的AI伙伴&#xff1f;这听起来像是科幻电影里的情节&#xff0c;但现在&#xff0c;借助开源的力量&#xff0c;你完全可以在自己的电脑上实现它。Zerolan Live Robot 就是这样一…

作者头像 李华
网站建设 2026/5/13 3:40:40

[408] [数据结构] 顺序表-代码题

01 问题&#xff1a;从顺序表中删除具有最小值的元素&#xff08;假设唯一&#xff09;并由函数返回被删元素的值。空出的位置由最后一个元素填补&#xff0c;若顺序表为空&#xff0c;则显示出错信息并退出运行。 答&#xff1a; bool DeleteMin(SqList &L, ElemType &…

作者头像 李华