Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมค้นหาความยาวของรายการย่อยที่ยาวที่สุดพร้อมเงื่อนไขที่กำหนดใน Python


สมมติว่าเรามีรายการตัวเลขที่เรียกว่า nums เราต้องหาความยาวของรายการย่อยที่ยาวที่สุด โดยที่ 2 * รายการย่อยขั้นต่ำ> สูงสุดของรายการย่อย

ดังนั้น หากอินพุตมีค่าเท่ากับ nums =[10, 2, 6, 6, 4, 4] ผลลัพธ์จะเป็น 4 เนื่องจากรายการย่อย [6, 6, 4,4] เป็นรายการย่อยที่ยาวที่สุดที่มีเกณฑ์ เป็น 2 * 4> 6.

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้-

  • ยกเลิก :=0

  • กำหนดสองคิวสิ้นสุดคู่ minq และ maxq

  • l :=0, r :=0

  • ในขณะที่ r <ขนาดของ nums ทำ

    • n :=nums[r]

    • ในขณะที่ minq และ n

      • ลบองค์ประกอบสุดท้ายออกจาก minq

    • ใส่ r ต่อท้าย minq

    • ในขณะที่ maxq และ n> nums[องค์ประกอบสุดท้ายของ maxq] ให้ทำ

      • ลบองค์ประกอบสุดท้ายออกจาก maxq

    • ใส่ r ต่อท้าย maxq

    • r :=r + 1

    • ในขณะที่ l

      • ถ้า minq[0] เหมือนกับ l แล้ว

        • ลบองค์ประกอบแรกของ minq

      • ถ้า maxq[0] เหมือนกับ l แล้ว

        • ลบองค์ประกอบแรกของ maxq

      • l :=l + 1

    • ret :=สูงสุดของ ret และ (r - l)

  • รีเทิร์น

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

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