ปัญหา
ให้รายการตัวเลข nums และค่า k ให้หาองค์ประกอบที่เล็กที่สุดลำดับ k (นับจาก 0) ในรายการ โดยต้องแก้ปัญหาในเวลา O(n) เฉลี่ย
ตัวอย่าง
Input: nums = [6, 4, 9, 3, 1], k = 2
Output: 4
# หลังเรียงลำดับ: [1, 3, 4, 6, 9] -> องค์ประกอบลำดับที่ 2 คือ 4
อัลกอริทึม: ใช้ Max Heap ขนาด k+1
- สร้าง Max Heap ว่าง
- ใส่
k+1องค์ประกอบแรกลงใน Heap (ใช้ค่าลบเพราะ Python มี min-heap เท่านั้น) - สำหรับองค์ประกอบที่เหลือ:
- ถ้าค่านั้น น้อยกว่า ค่าสูงสุดใน Heap (คือ
-maxHeap[0]) ให้ลบค่าสูงสุดออกและใส่ค่าใหม่เข้าไป
- ถ้าค่านั้น น้อยกว่า ค่าสูงสุดใน Heap (คือ
- คืนค่า
-maxHeap[0]ซึ่งเป็นคำตอบ
การทำงาน
- Heap จะเก็บ
k+1ค่าที่เล็กที่สุดที่เจอจนถึงตอนนั้น - รากของ Max Heap (ค่ามากที่สุดใน Heap) จะเป็นคำตอบเมื่อจบการวนลูป
- ความซับซ้อนเวลา: O(n log k) ≈ O(n) เมื่อ k คงที่
ตัวอย่างโค้ด
from heapq import heappop, heappush
def solve(nums, k):
maxHeap = []
# ใส่ k+1 ตัวแรก
for i in range(k + 1):
heappush(maxHeap, -nums[i])
# ประมวลผลตัวที่เหลือ
for i in range(k + 1, len(nums)):
if nums[i] < -maxHeap[0]:
heappop(maxHeap)
heappush(maxHeap, -nums[i])
return -maxHeap[0]
nums = [6, 4, 9, 3, 1]
k = 2
print(solve(nums, k)) # Output: 4
อินพุต / เอาต์พุต
Input: [6, 4, 9, 3, 1], 2
Output: 4