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.
#include <iostream>
#include <algorithm>
using namespace std;
int kthSmallest(int matrix[][100], int rows, int cols, int k) {
int totalElements = rows * cols;
int combined[totalElements];
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
sort(combined, combined + totalElements);
// Return the Kth smallest element
return combined[k - 1];
}
int main() {
int matrix[100][100] = {
{10, 20, 30},
{15, 25, 35},
{27, 29, 37},
{32, 33, 38}
};
int rows = 4, cols = 3, k = 5;
cout << "Kth smallest element: " << kthSmallest(matrix, rows, cols, k) << endl;
return 0;
}
Output:
Kth smallest element: 25
Method 2: Using Min-Heap
This method uses a min-heap to find the Kth smallest element efficiently.
#include <iostream>
#include <queue>
using namespace std;
struct Element {
int value;
int row;
int col;
};
struct Compare {
bool operator()(Element const &a, Element const &b) {
return a.value > b.value; // Min-heap
}
};
int kthSmallest(int matrix[][100], int rows, int cols, int k) {
priority_queue, Compare> minHeap;
// Push the first element of each row into the min-heap
for (int i = 0; i < rows; i++) {
minHeap.push({matrix[i][0], i, 0});
}
Element current;
for (int i = 0; i < k; i++) {
current = minHeap.top();
minHeap.pop();
// If there is a next element in the same row, push it into the heap
if (current.col + 1 < cols) {
minHeap.push({matrix[current.row][current.col + 1], current.row, current.col + 1});
}
}
return current.value; // The Kth smallest element
}
int main() {
int matrix[100][100] = {
{10, 20, 30},
{15, 25, 35},
{27, 29, 37},
{32, 33, 38}
};
int rows = 4, cols = 3, k = 5;
cout << "Kth smallest element: " << kthSmallest(matrix, rows, cols, k) << endl;
return 0;
}
Output:
Kth smallest element: 25
Method 3: Using Binary Search
This method uses binary search to find the Kth smallest element.
#include <iostream>
using namespace std;
int countLessEqual(int matrix[][100], int rows, int cols, int mid) {
int count = 0, 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;
}
int kthSmallest(int matrix[][100], int rows, int cols, int k) {
int low = matrix[0][0], high = matrix[rows - 1][cols - 1];
while (low < high) {
int mid = low + (high - low) / 2;
if (countLessEqual(matrix, rows, cols, mid) < k) {
low = mid + 1;
} else {
high = mid;
}
}
return low; // The Kth smallest element
}
int main() {
int matrix[100][100] = {
{10, 20, 30},
{15, 25, 35},
{27, 29, 37},
{32, 33, 38}
};
int rows = 4, cols = 3, k = 5;
cout << "Kth smallest element: " << kthSmallest(matrix, rows, cols, k) << endl;
return 0;
}
Output:
Kth smallest element: 25