在Python中查找可以删除的最小子列表的长度,使剩余元素的总和可被k整除

在Python中查找可以删除的最小子列表的长度,使剩余元素的总和可被k整除

假设我们有一个具有正值的列表 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 := 字典,最初对 key 0 存储 -1
  • res := n
  • 对于 i 在范围 0 到 n – 1,执行以下操作
    • 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教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程