用 Python 编写程序,求子数组以 m 为模的最大和
pythonserver side programmingprogramming更新于 2025/12/17 12:28:17
用 Python 编写程序,求子数组以 m 为模的最大和
假设我们有一个包含 n 个元素的数组 nums。我们有另一个整数 m。我们必须找到其任意子数组模 m 之和的最大值。
因此,如果输入为 nums = [1,5,7,3] m = 5,则输出将为 3,因为
- [1] mod 5 = 1
- [5] mod 5 = 0
- [7] mod 5 = 2
- [3] mod 5 = 3
- [1,5] mod 5 = 1
- [5,7] mod 5 = 2
- [7,3] mod 5 = 0
- [1,5,7] mod 5 = 3
- [5,7,3] mod 5 = 0
- [1,5,7,3] mod 5 = 1
为了解决这个问题,我们将遵循以下步骤 −
- csum := 一个列表,最初将 nums[0] mod m 插入其中
- 对于 nums 中除第一个值之外的每个 x,执行
- 在 csum 末尾插入 (csum 的最后一项 + x) mod m
- seen := 一个最初只有一个元素的列表,该元素为 0
- max_sum := -1
- 对于 csum 中的每个 s,执行
- idx := 将 s 插入到 seen 的最左边的位置,以便对列表进行排序
- 如果 idx <已看到的大小,则
- max_sum := max_sum 和 s 的最大值
- 否则,
- 将 s 插入到已看到最左边的索引处,以便数组已排序
- 将 s 插入到已看到最左边的索引处,以便数组已排序
- 返回 max_sum
示例
让我们看看下面的实现以便更好地理解 −
import bisect def solve(nums, m): csum = [nums[0] % m] for x in nums[1:]: csum.append((csum[-1] + x) % m) seen = [0] max_sum = -1 for s in csum: idx = bisect.bisect_left(seen, s) if idx < len(seen): max_sum = max(max_sum, s, (s - seen[idx]) % m) else: max_sum = max(max_sum, s) bisect.insort_left(seen, s) return max_sum nums = [1,5,7,3] m = 5 print(solve(nums, m))
输入
"pptpp", [(1,1),(1,4),(1,1),(0,2)]
输出
3
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

