Python程序:使总和可被P整除


假设我们有一个数组nums和另一个值p,我们删除最小的子数组(不是整个数组),使得剩余值的总和可以被p整除。我们需要找到需要删除的最小子数组的长度,如果没有这样的子数组,则返回-1。

因此,如果输入类似于nums = [8,2,6,5,3] p = 7,则输出将为1,因为如果我们删除3,则总和将为21,并且可以被7整除。

为了解决这个问题,我们将遵循以下步骤:

  • ans := 无限大
  • s := (nums中所有元素的和) mod p
  • d := 一个包含键值对{0: -1}的映射
  • cum := 0
  • 如果s等于0,则
    • 返回0
  • 对于i从0到nums的大小,执行以下操作:
    • cum := cum + nums[i]
    • r := cum mod p
    • 如果(r-s)mod p存在于d中,则
      • ans := ans和i - d[(r-s) mod p]的最小值
    • d[r] := i
  • 如果ans < nums的大小,则返回ans,否则返回-1

示例

让我们看看以下实现以获得更好的理解:

def solve(nums, p):
   ans = float("inf")
   s = sum(nums) % p
   d = {0:-1}
   cum = 0
   if s == 0:
      return 0
   for i in range(len(nums)):
      cum+=nums[i]
      r = cum%p
      if (r-s)%p in d:
         ans = min(ans, i-d[(r-s)%p])
      d[r] = i
   return ans if ans<len(nums) else -1

nums = [8,2,6,5,3]
p = 7
print(solve(nums, p))

输入

[8,2,6,5,3], 7

输出

1

更新于: 2021年10月4日

325 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.