ออกแบบคลาส KthLargest หาค่าที่ k-th largest ในสตรีมตัวเลข (เรียงจากมากไปน้อย ไม่นับ distinct) Constructor รับ k และอาร์เรย์เริ่มต้น nums เมธอด add(val) คืนค่า k-th largest ปัจจุบัน
ตัวอย่าง
k=3, nums=[4,5,8,2] → add(3)→4, add(5)→5, add(10)→5, add(9)→8, add(4)→8
ขั้นตอนการแก้ปัญหา (Min-Heap แบบง่าย)
- เก็บตัวเลขทั้งหมดในลิสต์
- เมธอด
add: เพิ่มค่า, เรียงลำดับ, คืนarray[-k] - หมายเหตุ: วิธีนี้ O(n log n) ต่อการเพิ่ม สำหรับประสิทธิภาพดีกว่าควรใช้ Min-Heap ขนาด k
การติดตั้งใน Python (แบบเรียงลำดับ)
class KthLargest:
def __init__(self, k, nums):
self.k = k
self.array = sorted(nums)
def add(self, val):
import bisect
bisect.insort(self.array, val)
return self.array[-self.k]
ob = KthLargest(3, [4,5,8,2])
print(ob.add(3)) # 4
print(ob.add(5)) # 5
print(ob.add(10)) # 5
print(ob.add(9)) # 8
print(ob.add(4)) # 8
อินพุต / เอาต์พุต
Input: add(3), add(5), add(10), add(9), add(4) Output: 4, 5, 5, 8, 8