用 Python 编写程序,查找可以删除的最小子列表的长度,使总和可以被 k 整除
pythonserver side programmingprogramming更新于 2026/1/18 15:40:17
假设我们有一个包含正值的列表,称为 nums,还有一个正数 k。我们必须找到可以从 nums 中删除的最短子列表(可能为空)的长度,使得剩余元素的总和可以被 k 整除。但我们不能删除整个列表。如果没有要删除的子列表,则返回 -1。
因此,如果输入为 nums = [5,8,6,3] k = 8,则输出将为 1,因为 [5,8,6,3] 元素的当前总和为 22。如果我们删除长度为 1 的子列表 [6],则总和为 16,可被 8 整除。
要解决这个问题,我们将遵循以下步骤 −
- rem := (nums 中存在的所有元素的总和 + k) mod k
- 如果 rem 与 0 相同,则
- 返回 0
- n := nums 的大小
- presum := 0
- mp := 字典,最初存储 -1 key 0
- res := n
- 对于范围在 0 到 n - 1 内的 i,执行
- presum := presum + nums[i]
- m :=(presum + k) mod k
- mp[m] := i
- 如果 (m - rem + k) mod k 存在于 mp 中,则
- res := res 和 (i - mp[(m - rem + k) mod k]) 的最小值
- 如果 res 与 n 不同,则返回 res,否则返回 -1
示例
让我们看看下面的实现以便更好地理解 −
def solve(nums, k):
rem = (sum(nums) + k) % k
if rem == 0:
return 0
n, presum = len(nums), 0
mp = {0: -1}
res = n
for i in range(n):
presum += nums[i]
m = (presum + k) % k
mp[m] = i
if (m - rem + k) % k in mp:
res = min(res, i - mp[(m - rem + k) % k])
return res if res != n else -1
nums = [5,8,6,3]
k = 8
print(solve(nums, k))
输入
[5,8,6,3], 8
输出
1
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

