用 Python 编写程序,根据值范围条件查找最长子列表的长度

pythonserver side programmingprogramming更新于 2026/1/23 13:00:17

假设我们有一个名为 nums 的数字列表,我们必须找到最长子列表的长度,其中 2 *(子列表的最小值)>(子列表的最大值)。

因此,如果输入为 nums = [10, 2, 6, 6, 4, 4],则输出将为 4,因为子列表 [6, 6, 4, 4] 是满足给定条件 (2*4) > 的最长子列表6.

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

  • ret := 0
  • minq := 一个空的双端队列
  • maxq := 一个空的双端队列
  • l := 0
  • r := 0
  • 当 r < nums 的大小时,执行
    • n := nums[r]
    • 当 minq 不为空且 n < nums[minq 的最后一个元素] 时,执行
      • 从 minq 中删除最后一个元素
    • 在 minq 末尾插入 r
    • 当 maxq 不为空且 n > nums[maxq 的最后一个元素],执行
      • 从 maxq 中删除最后一个元素
    • 在 maxq 末尾插入 r
    • r := r + 1
    • while l < r 和 nums[minq[0]] * 2 <= nums[maxq[0]],执行
      • 如果 minq[0] 与 l 相同,则
        • 从 minq 中删除左项
      • 如果 maxq[0] 与 l 相同,则
        • 删除 maxq 的最后一项
      • l := l + 1
    • ret := ret 和 (r - l) 的最大值
  • 返回 ret

示例

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

from collections import deque
def solve(nums):
   ret = 0
   minq, maxq = deque(), deque()
   l, r = 0, 0
   while r < len(nums):
      n = nums[r]
      while minq and n < nums[minq[-1]]:
         minq.pop()
      minq.append(r)
      while maxq and n > nums[maxq[-1]]:
         maxq.pop()
      maxq.append(r)
      r += 1
      while l < r and nums[minq[0]] * 2 <= nums[maxq[0]]:
         if minq[0] == l:
            minq.popleft()
         if maxq[0] == l:
            maxq.popleft()
         l += 1
      ret = max(ret, r - l)
   return ret

nums = [10, 2, 6, 6, 4, 4]
print(solve(nums))

输入

[10, 2, 6, 6, 4, 4]

输出

4

相关文章


有用资源