2387. Median of a Row Wise Sorted Matrix π
Description
Given an m x n matrix grid containing an odd number of integers where each row is sorted in non-decreasing order, return the median of the matrix.
You must solve the problem in less than O(m * n) time complexity.
Example 1:
Input: grid = [[1,1,2],[2,3,3],[1,3,4]] Output: 2 Explanation: The elements of the matrix in sorted order are 1,1,1,2,2,3,3,3,4. The median is 2.
Example 2:
Input: grid = [[1,1,3,3,4]] Output: 3 Explanation: The elements of the matrix in sorted order are 1,1,3,3,4. The median is 3.
Constraints:
m == grid.lengthn == grid[i].length1 <= m, n <= 500mandnare both odd.1 <= grid[i][j] <= 106grid[i]is sorted in non-decreasing order.
Solutions
Solution 1: Two Binary Searches
Thinking
Each row is sorted; we need the median of the whole matrix without flattening. It is the \(\lceil mn/2 \rceil\)-th value, so we binary-search the value domain.
To test \(x\), \(bisect\) each row for the count of entries \(\le x\). If that count meets the target, the median is at most \(x\). An outer search on the domain finishes it.
The median is actually the \(target = \left \lceil \frac{m \times n}{2} \right \rceil\)-th number after sorting.
We perform a binary search on the elements of the matrix \(x\), counting the number of elements in the grid that are greater than \(x\), denoted as \(cnt\). If \(cnt \ge target\), it means the median is on the left side of \(x\) (including \(x\)); otherwise, it is on the right side.
The time complexity is \(O(m \times \log n \times \log M)\), where \(m\) and \(n\) are the number of rows and columns of the grid, respectively, and \(M\) is the maximum element in the grid. The space complexity is \(O(1)\).
1 2 3 4 5 6 7 8 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |