程序在Python中查找具有给定条件的最长子列表的长度

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

因此,如果输入像nums = [10,2,6,6,4,4,4],则输出将为4,因为子列表[6,6,4,4]是保存条件的最长子列表如2 * 4> 6。

为了解决这个问题,我们将按照以下步骤操作:

  • ret:= 0

  • 定义两个双端队列minq和maxq

  • l:= 0,r:= 0

  • 当r <nums的大小时

    • 如果minq [0]与l相同,则

    • 如果maxq [0]与l相同,则

    • l:= l + 1

    • 删除minq的第一个元素

    • 删除maxq的第一个元素

    • 从maxq删除最后一个元素

    • 从minq中删除最后一个元素

    • n:= nums [r]

    • 而minq和n <nums [minq的最后一个元素],

    • 在minq的末尾插入r

    • 而maxq和n> nums [maxq的最后一个元素],

    • 在maxq的末尾插入r

    • r:= r + 1

    • 当l <r和nums [minq [0]] * 2 <= nums [maxq [0]]时,

    • ret:= ret的最大值和(r-l)

    • 返回ret

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

    示例

    class Solution:
       def solve(self, nums):
          from collections import deque
          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
    ob = Solution()nums = [10, 2, 6, 6, 4, 4]
    print(ob.solve(nums))

    输入值

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

    输出结果

    4
    猜你喜欢