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

หาองค์ประกอบที่ K น้อยที่สุดในเมทริกซ์ที่เรียงแล้ว (Kth Smallest in Sorted Matrix) ใน Python

โจทย์: กำหนดเมทริกซ์ n×n ที่แถวและคอลัมน์เรียงเพิ่มขึ้น หาองค์ประกอบที่ K น้อยที่สุด (ไม่ใช่ unique)

ตัวอย่าง

Matrix = [[1,5,9],[10,11,13],[12,13,15]], k = 8
Output: 13

อัลกอริทึม: Binary Search + Count ≤ mid

  1. Binary search บนช่วงค่า [min, max] ของเมทริกซ์
  2. สำหรับ mid แต่ละค่า นับจำนวนองค์ประกอบ ≤ mid
  3. ใช้ property: เริ่มจากมุมขวาบน (i=0, j=n-1) เดินลง-ซ้าย

ตัวอย่างโค้ด Python

class Solution(object):
    def kthSmallest(self, matrix, k):
        n = len(matrix)
        low, high = matrix[0][0], matrix[n-1][n-1]
        
        while low <= high:
            mid = low + (high - low) // 2
            count = self.count_less_equal(matrix, mid)
            
            if count < k:
                low = mid + 1
            else:
                high = mid - 1
        
        return low
    
    def count_less_equal(self, matrix, target):
        """นับจำนวนองค์ประกอบ ≤ target เริ่มจากมุมขวาบน"""
        n = len(matrix)
        i, j = 0, n - 1
        count = 0
        
        while i < n and j >= 0:
            if matrix[i][j] > target:
                j -= 1  # เลื่อนซ้าย
            else:
                count += j + 1  # ทุกตัวในแถวนี้ซ้ายสุดถึง j ≤ target
                i += 1  # เลื่อนลง
        
        return count

# ทดสอบ
matrix = [[1,5,9],[10,11,13],[12,13,15]]
ob = Solution()
print(ob.kthSmallest(matrix, 8))  # Output: 13

ตัวอย่าง Input/Output

Input: matrix=[[1,5,9],[10,11,13],[12,13,15]] k=8
Output: 13

ความซับซ้อน: Time O(n log(max-min)), Space O(1) - ดีกว่า Heap O(k log n) เมื่อ k ใหญ่