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.
import java.util.Arrays; public class KthSmallestElement { public static int kthSmallest(int[][] matrix, int k) { int rows = matrix.length; int cols = matrix[0].length; int[] combined = new int[rows * cols]; int index = 0; // Combine all elements into a single array for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { combined[index++] = matrix[i][j]; } } // Sort the combined array Arrays.sort(combined); // Return the Kth smallest element return combined[k - 1]; } public static void main(String[] args) { int[][] matrix = { {10, 20, 30}, {15, 25, 35}, {27, 29, 37}, {32, 33, 38} }; int k = 5; System.out.println("Kth smallest element: " + kthSmallest(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 java.util.PriorityQueue; public class KthSmallestElement { static class Element { int value; int row; int col; Element(int value, int row, int col) { this.value = value; this.row = row; this.col = col; } } public static int kthSmallest(int[][] matrix, int k) { int rows = matrix.length; int cols = matrix[0].length; PriorityQueueminHeap = new PriorityQueue<>((a, b) -> a.value - b.value); // Push the first element of each row into the min-heap for (int i = 0; i < rows; i++) { minHeap.offer(new Element(matrix[i][0], i, 0)); } Element current = null; for (int i = 0; i < k; i++) { current = minHeap.poll(); // If there is a next element in the same row, push it into the heap if (current.col + 1 < cols) { minHeap.offer(new Element(matrix[current.row][current.col + 1], current.row, current.col + 1)); } } return current.value; // The Kth smallest element } public static void main(String[] args) { int[][] matrix = { {10, 20, 30}, {15, 25, 35}, {27, 29, 37}, {32, 33, 38} }; int k = 5; System.out.println("Kth smallest element: " + kthSmallest(matrix, k)); } }
Output:
Kth smallest element: 25
Method 3: Using Binary Search
This method uses binary search to find the Kth smallest element.
public class KthSmallestElement { public static int countLessEqual(int[][] matrix, int mid) { int count = 0; int rows = matrix.length; int cols = matrix[0].length; int row = rows - 1, col = 0; while (row >= 0 && col < cols) { if (matrix[row][col] <= mid) { count += (row + 1); // All elements in this row are <= mid col++; } else { row--; } } return count; } public static int kthSmallest(int[][] matrix, int k) { int low = matrix[0][0], high = matrix[matrix.length - 1][matrix[0].length - 1]; while (low < high) { int mid = low + (high - low) / 2; if (countLessEqual(matrix, mid) < k) { low = mid + 1; } else { high = mid; } } return low; // The Kth smallest element } public static void main(String[] args) { int[][] matrix = { {10, 20, 30}, {15, 25, 35}, {27, 29, 37}, {32, 33, 38} }; int k = 5; System.out.println("Kth smallest element: " + kthSmallest(matrix, k)); } }
Output:
Kth smallest element: 25