使用 Python 查找大小为 M 的最新分组的程序


假设我们有一个数组 arr,它包含从 1 到 n 的数字排列。如果我们有一个大小为 n 的二进制字符串,并且最初所有位都设置为零。现在,在从 1 到 n 的每个步骤 i(二进制字符串和 arr 的索引都从 1 开始),位置 arr[i] 的位设置为 1。我们还有另一个值 m,我们需要找到存在大小为 m 的 1 的分组的最新步骤。这里,1 的分组指的是连续的 1 的子字符串,不能向任何方向扩展。我们必须找到存在长度正好为 m 的 1 的分组的最新步骤。如果找不到这样的分组,则返回 -1。

因此,如果输入类似于 arr = [3,5,1,2,4] m = 3,则输出将为 4,因为初始二进制字符串为“00000”,然后按照以下步骤进行:

  • “00100”,分组:["1"]

  • “00101”,分组:["1", "1"]

  • “10101”,分组:["1", "1", "1"]

  • “11101”,分组:["111", "1"]

  • “11111”,分组:["11111"]

这里,存在大小为 3 的分组的最新步骤是步骤 4。

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

  • n := arr 的大小

  • num := 0

  • ans := -1

  • l := 一个大小为 n 的数组,并填充 0

  • r := 一个大小为 n 的数组,并填充 0

  • 对于 i in range 0 到 n - 1,执行:

    • cur := 1

    • idx := arr[i] - 1

    • 如果 r[idx] 等于 m,则:

      • num := num - 1

    • 如果 l[idx] 等于 m,则:

      • num := num - 1

    • cur := cur + l[idx] + r[idx]

    • num := num + (cur 等于 m)

    • 如果 num > 0,则:

      • ans := ans 和 i + 1 的最大值

    • 如果 idx - l[idx] > 0,则:

      • r[idx - l[idx] - 1] := cur

    • 如果 idx + r[idx] < n - 1,则:

      • l[idx + r[idx] + 1] := cur

  • 返回 ans

让我们看看下面的实现以更好地理解:

示例

实时演示

def solve(arr, m):
   n = len(arr)
   num = 0
   ans = -1
   l = [0] * n
   r = [0] * n
   for i in range(n):
      cur = 1
      idx = arr[i] - 1
      if r[idx] == m:
         num -= 1
      if l[idx] == m:
         num -= 1
      cur += l[idx] + r[idx]
      num += cur == m
      if num > 0:
         ans = max(ans, i + 1)
      if idx - l[idx] > 0:
         r[idx - l[idx] - 1] = cur
      if idx + r[idx] < n - 1:
         l[idx + r[idx] + 1] = cur
   return ans
arr = [3,5,1,2,4]
m = 3
print(solve(arr, m))

输入

[3,5,1,2,4], 3

输出

4

更新于:2021年5月29日

142 次查看

启动你的职业生涯

完成课程获得认证

开始
广告