สมมติว่าเรามีรายการตัวเลข เราต้องการหาความยาวของลำดับย่อยที่เพิ่มขึ้นมากที่สุด (Longest Increasing Subsequence - LIS) ตัวอย่างเช่น หากอินพุตคือ [6, 1, 7, 2, 8, 3, 4, 5] ผลลัพธ์จะเป็น 5 เนื่องจากลำดับย่อยที่เพิ่มขึ้นมากที่สุดคือ [2, 3, 4, 5, 6]
ขั้นตอนการแก้ปัญหา (O(n log n) ด้วย Binary Search)
- สร้างอาร์เรย์
tailsขนาดเท่ากับnumsและเติมด้วย 0 - กำหนด
size = 0 - สำหรับแต่ละองค์ประกอบ
xในnums:- กำหนด
i = 0,j = size - วนลูป while
i != j:mid = i + (j - i) // 2- หาก
tails[mid] < xให้i = mid + 1มิฉะนั้นj = mid
tails[i] = xsize = max(i + 1, size)
- กำหนด
- คืนค่า
size
ตัวอย่างโค้ด Python
class Solution:
def solve(self, nums):
tails = [0] * len(nums)
size = 0
for x in nums:
i, j = 0, size
while i != j:
mid = i + (j - i) // 2
if tails[mid] < x:
i = mid + 1
else:
j = mid
tails[i] = x
size = max(i + 1, size)
return size
ob = Solution()
nums = [7, 2, 8, 3, 9, 4, 5, 6]
print(ob.solve(nums)) # Output: 5
อินพุต
[7, 2, 8, 3, 9, 4, 5, 6]
เอาต์พุต
5