สมมติว่าเรามีรายการตัวเลข nums และค่า k พิจารณาการดำเนินการที่เราสามารถเพิ่มค่าขององค์ประกอบใดองค์ประกอบหนึ่งได้ 1 หน่วยต่อครั้ง หากเราสามารถดำเนินการได้สูงสุด k ครั้ง เราต้องการหารายการย่อยที่ยาวที่สุดที่มีองค์ประกอบเท่ากันทุกตัว
ตัวอย่างเช่น หาก nums = [3, 5, 9, 6, 10, 7] และ k = 6 ผลลัพธ์จะเป็น 3 เนื่องจากเราสามารถเพิ่ม 9 หนึ่งครั้ง และ 6 สี่ครั้ง เพื่อได้รายการย่อย [10, 10, 10]
ขั้นตอนการแก้ปัญหา (Sliding Window + Deque)
- หาก
numsว่าง ให้คืนค่า 0 - ใช้ Deque
wMaxเก็บคู่(value, index)เรียงตามค่ามากไปน้อย - กำหนด
i = 0,inc = 0(ค่าที่เพิ่มสะสม) - วนลูป
jจาก 1 ถึงlen(nums) - 1:- ลบองค์ประกอบซ้ายสุดของ
wMaxที่มี index <i pMax = wMax[0][0](ค่าสูงสุดในหน้าต่างปัจจุบัน)- ลบองค์ประกอบขวาสุดของ
wMaxที่มีค่า <=nums[j] - เพิ่ม
(nums[j], j)เข้าwMax - คำนวณ
incตามการเปลี่ยนแปลงของค่าสูงสุด - หาก
kให้ย่อหน้าต่างทางซ้าย (i += 1) และปรับinc
- ลบองค์ประกอบซ้ายสุดของ
- คืนค่า
len(nums) - i
ตัวอย่างโค้ด Python
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 and 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)) # Output: 3
อินพุต
[3, 5, 9, 6, 10, 7], 6
เอาต์พุต
3