Kth Smallest Element in a Row-Column Wise Sorted Matrix
Understanding the Problem
The goal is to find the Kth smallest element in a matrix that is sorted row-wise and column-wise.
Method 1: Using a Combined Array
This method combines all elements into a single array and then sorts it.
def kth_smallest(matrix, k):
combined = []
# Combine all elements into a single array
for row in matrix:
combined.extend(row)
# Sort the combined array
combined.sort()
# Return the Kth smallest element
return combined[k - 1]
# Example usage
matrix = [
[10, 20, 30],
[15, 25, 35],
[27, 29, 37],
[32, 33, 38]
]
k = 5
print("Kth smallest element:", kth_smallest(matrix, k))
Output:
Kth smallest element: 25
Method 2: Using Min-Heap
This method uses a min-heap to find the Kth smallest element efficiently.
import heapq
def kth_smallest(matrix, k):
min_heap = []
# Push the first element of each row into the min-heap
for row in matrix:
heapq.heappush(min_heap, (row[0], 0, 0)) # (value, row, column)
current = None
for _ in range(k):
current = heapq.heappop(min_heap)
# If there is a next element in the same row, push it into the heap
if current[1] + 1 < len(matrix[0]):
heapq.heappush(min_heap, (matrix[current[0]][current[1] + 1], current[0], current[1] + 1))
return current[0] # The Kth smallest element
# Example usage
matrix = [
[10, 20, 30],
[15, 25, 35],
[27, 29, 37],
[32, 33, 38]
]
k = 5
print("Kth smallest element:", kth_smallest(matrix, k))
Output:
Kth smallest element: 25
Method 3: Using Binary Search
This method uses binary search to find the Kth smallest element.
def count_less_equal(matrix, mid):
count = 0
row = len(matrix) - 1
col = 0
while row >= 0 and col < len(matrix[0]):
if matrix[row][col] <= mid:
count += (row + 1) # All elements in this row are <= mid
col += 1
else:
row -= 1
return count
def kth_smallest(matrix, k):
low = matrix[0][0]
high = matrix[-1][-1]
while low < high:
mid = low + (high - low) // 2
if count_less_equal(matrix, mid) < k:
low = mid + 1
else:
high = mid
return low # The Kth smallest element
# Example usage
matrix = [
[10, 20, 30],
[15, 25, 35],
[27, 29, 37],
[32, 33, 38]
]
k = 5
print("Kth smallest element:", kth_smallest(matrix, k))
Output:
Kth smallest element: 25