Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình tìm độ dài của danh sách con dài nhất với điều kiện cho trước bằng Python

Giả sử chúng ta có một danh sách các số được gọi là nums, chúng ta phải tìm độ dài của danh sách dài nhất trong đó 2 * tối thiểu của danh sách con> tối đa của danh sách con.

Vì vậy, nếu đầu vào giống như nums =[10, 2, 6, 6, 4, 4], thì đầu ra sẽ là 4, vì danh sách con [6, 6, 4,4] là danh sách con dài nhất chứa các tiêu chí dưới dạng 2 * 4> 6.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau−

  • ret:=0

  • xác định hai hàng đợi kết thúc kép minq và maxq

  • l:=0, r:=0

  • while r

    • n:=nums [r]

    • trong khi minq và n

      • xóa phần tử cuối cùng khỏi minq

    • chèn r vào cuối minq

    • trong khi maxq và n> nums [phần tử cuối cùng của maxq], thực hiện

      • xóa phần tử cuối cùng khỏi maxq

    • chèn r vào cuối maxq

    • r:=r + 1

    • trong khi l

      • nếu minq [0] giống với l, thì

        • xóa phần tử đầu tiên của minq

      • nếu maxq [0] giống với l thì

        • xóa phần tử đầu tiên của maxq

      • l:=l + 1

    • ret:=tối đa ret và (r - l)

  • trả lại ret

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

Ví dụ

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))

Đầu vào

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

Đầu ra

4