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

โปรแกรมค้นหารายการย่อยที่เทียบเท่าที่ยาวที่สุดหลังจากเพิ่ม K ใน Python


สมมติว่าเรามีรายการตัวเลขที่เรียกว่า nums และ k ตอนนี้ ให้พิจารณาการดำเนินการที่เราสามารถเพิ่มองค์ประกอบใดองค์ประกอบหนึ่งได้เพียงครั้งเดียว หากเราสามารถดำเนินการได้มากถึง k ครั้ง เราต้องหารายการย่อยที่ยาวที่สุดที่มีองค์ประกอบเท่ากัน

ดังนั้นหากอินพุตเป็นเหมือน nums =[3, 5, 9, 6, 10, 7] k =6 ผลลัพธ์จะเป็น 3 เนื่องจากเราสามารถเพิ่ม 9 หนึ่งครั้งและ 6 สี่ครั้งเพื่อรับรายการย่อย [10, 10 , 10].

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

  • ถ้าตัวเลขว่างก็

    • คืนค่า 0

  • wMax :=คิวสิ้นสุดคู่ที่มีขนาดเท่ากับ nums และใส่คู่ (nums[0], 0)

  • ผม :=0, inc :=0

  • สำหรับ j ในช่วง 1 ถึงขนาดของ nums ทำ

    • ในขณะที่ wMax ไม่ว่างเปล่าและ wMax[0, 1]

      • ลบองค์ประกอบด้านซ้ายของ wMax

    • pMax :=wMax[0, 0]

    • ในขณะที่ wMax ไม่ว่างเปล่าและองค์ประกอบแรกของรายการสุดท้ายของ wMax <=nums[j] ให้ทำ

      • ลบองค์ประกอบที่ถูกต้องออกจาก wMax

    • แทรก (nums[j], j) ต่อท้าย wMax

    • ถ้า pMax

      • inc =inc + (j - i) * (wMax[0, 0] - pMax)

    • มิฉะนั้น

      • inc :=inc + pMax - nums[j]

    • ถ้า inc> k แล้ว

      • inc :=inc - wMax[0, 0] - nums[i]

      • ในขณะที่ wMax ไม่ว่างเปล่าและ wMax[0, 1] <=i ทำ

        • ลบองค์ประกอบด้านซ้ายของ wMax

      • ถ้า wMax[0, 0]

        • inc =inc - (nums[i] - wMax[0, 0]) * (j - i)

      • ผม :=ผม + 1

  • ขนาดส่งคืนของ nums - i

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

ตัวอย่าง

from collections import deque
class Solution:
   def solve(self, nums, k):
      if not nums:
         return 0
      wMax = deque([(nums[0], 0)], maxlen=len(nums))
      i = 0
      inc = 0
      for j in range(1, len(nums)):
         while wMax and wMax[0][1] < i:
            wMax.popleft()
         pMax = wMax[0][0]

         while wMax and wMax[-1][0] <= nums[j]:
            wMax.pop()
         wMax.append((nums[j], j))
         if pMax < wMax[0][0]:
            inc += (j - i) * (wMax[0][0] - pMax)
         else:
            inc += pMax - nums[j]
         if inc > k:
            inc -= wMax[0][0] - nums[i]
            while wMax and wMax[0][1] <= i:
               wMax.popleft()
            if wMax[0][0] < nums[i]:
               inc -= (nums[i] - wMax[0][0]) * (j - i)
            i += 1
      return len(nums) - i
ob = Solution()
nums = [3, 5, 9, 6, 10, 7]
k = 6
print(ob.solve(nums, k))

อินพุต

[3, 5, 9, 6, 10, 7], 6

ผลลัพธ์

3