Find Median in a Row-Wise Sorted Matrix
Understanding the Problem
The goal is to find the median of a row-wise sorted matrix.
Method 1: Using a Combined Array
This method combines all elements into a single array and then finds the median.
#include <iostream>
#include <algorithm>
using namespace std;
double findMedian(int matrix[][100], int rows, int cols) {
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);
// Find the median
if (totalElements % 2 == 0) {
return (combined[totalElements / 2 - 1] + combined[totalElements / 2]) / 2.0;
} else {
return combined[totalElements / 2];
}
}
int main() {
int matrix[100][100] = {
{1, 3, 5},
{2, 6, 9},
{3, 6, 9}
};
int rows = 3, cols = 3;
cout << "Median: " << findMedian(matrix, rows, cols) << endl;
return 0;
}
Output:
Median: 3.0
Method 2: Using Binary Search
This method uses binary search to find the median efficiently.
#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;
}
double findMedian(int matrix[][100], int rows, int cols) {
int low = 0, high = 100000; // Assuming the range of elements
int desired = (rows * cols + 1) / 2; // Median position
while (low < high) {
int mid = low + (high - low) / 2;
if (countLessEqual(matrix, rows, cols, mid) < desired) {
low = mid + 1;
} else {
high = mid;
}
}
return low; // The median
}
int main() {
int matrix[100][100] = {
{1, 3, 5},
{2, 6, 9},
{3, 6, 9}
};
int rows = 3, cols = 3;
cout << "Median: " << findMedian(matrix, rows, cols) << endl;
return 0;
}
Output:
Median: 3.0
Method 3: Using a Two-Pointer Technique
This method uses a two-pointer technique to find the median.
#include <iostream>
using namespace std;
double findMedian(int matrix[][100], int rows, int cols) {
int totalElements = rows * cols;
int medianPos = (totalElements - 1) / 2;
int count = 0, current = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
current = matrix[i][j];
if (count == medianPos) {
return current; // Found the median
}
count++;
}
}
return -1; // Should not reach here
}
int main() {
int matrix[100][100] = {
{1, 3, 5},
{2, 6, 9},
{3, 6, 9}
};
int rows = 3, cols = 3;
cout << "Median: " << findMedian(matrix, rows, cols) << endl;
return 0;
}
Output:
Median: 3.0