Difficulty | Source | Tags | ||
---|---|---|---|---|
Medium |
160 Days of Problem Solving |
|
The problem can be found at the following link: Problem Link
You are given a strictly sorted 2D matrix mat[][]
of size n x m
and a number x
. Your task is to find whether the number x
is present in the matrix or not.
Note: In a strictly sorted matrix, each row is sorted in strictly increasing order, and the first element of the ith row (i!=0) is greater than the last element of the (i-1)th row.
Input:
mat[][] = [[1, 5, 9], [14, 20, 21], [30, 34, 43]]
, x = 14
Output:
true
Explanation:
14 is present in the matrix, so the output is true
.
Input:
mat[][] = [[1, 5, 9, 11], [14, 20, 21, 26], [30, 34, 43, 50]]
, x = 42
Output:
false
Explanation:
42 is not present in the matrix.
Input:
mat[][] = [[87, 96, 99], [101, 103, 111]]
, x = 101
Output:
true
Explanation:
101 is present in the matrix.
$1 <= n, m <= 1000$ $1 <= mat[i][j] <= 10^9$ $1 <= x <= 10^9$
This problem can be solved efficiently using binary search. Even though the matrix is 2D, its structure allows it to be treated as a sorted 1D array where:
- The element at position
(i, j)
in the matrix corresponds to the positioni * m + j
in the flattened array (wherem
is the number of columns). - Using this, we can perform a binary search directly on the matrix as if it were a 1D array.
- Initialize two pointers,
l = 0
(start) andr = n * m - 1
(end of the flattened matrix). - Use binary search to find the middle index, calculate the corresponding value in the matrix using:
row = mid / m
col = mid % m
- Compare the middle value with
x
:- If equal, return
true
. - If less than
x
, move the left pointerl
tomid + 1
. - If greater than
x
, move the right pointerr
tomid - 1
.
- If equal, return
- If the loop ends without finding
x
, returnfalse
.
- Expected Time Complexity: O(log(n * m)), as we perform binary search on a virtual array of size
n * m
. - Expected Auxiliary Space Complexity: O(1), as we only use a constant amount of additional space.
class Solution {
public:
bool searchMatrix(vector<vector<int>>& mat, int x) {
int n = mat.size(), m = mat[0].size(), l = 0, r = n * m - 1;
while (l <= r) {
int mid = (l + r) / 2, val = mat[mid / m][mid % m];
if (val == x) return true;
val < x ? l = mid + 1 : r = mid - 1;
}
return false;
}
};
class Solution {
public boolean searchMatrix(int[][] mat, int x) {
int n = mat.length, m = mat[0].length, l = 0, r = n * m - 1;
while (l <= r) {
int mid = (l + r) / 2, val = mat[mid / m][mid % m];
if (val == x) return true;
if (val < x) l = mid + 1;
else r = mid - 1;
}
return false;
}
}
class Solution:
def searchMatrix(self, mat, x):
n, m = len(mat), len(mat[0])
l, r = 0, n * m - 1
while l <= r:
mid = (l + r) // 2
val = mat[mid // m][mid % m]
if val == x:
return True
if val < x:
l = mid + 1
else:
r = mid - 1
return False
For discussions, questions, or doubts related to this solution, feel free to connect on LinkedIn: Any Questions. Let’s make this learning journey more collaborative!
⭐ If you find this helpful, please give this repository a star! ⭐