240. Search a 2D Matrix II
Write an efficient algorithm that searches for a value target in an m x n integer matrix matrix. This matrix has the following properties:
- Integers in each row are sorted in ascending from left to right.
- Integers in each column are sorted in ascending from top to bottom.
Example 1:
Input: matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
Output: true
Example 2:
Input: matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
Output: false
Constraints:
- m == matrix.length
- n == matrix[i].length
- 1 <= n, m <= 300
- − 1 0 9 < = m a t r i x [ i ] [ j ] < = 1 0 9 -10^9 <= matrix[i][j] <= 10^9 −109<=matrix[i][j]<=109
- All the integers in each row are sorted in ascending order.
- All the integers in each column are sorted in ascending order.
- − 1 0 9 < = t a r g e t < = 1 0 9 -10^9 <= target <= 10^9 −109<=target<=109
From: LeetCode
Link: 240. Search a 2D Matrix II
Solution:
Ideas:
To search efficiently in such a matrix, you can take advantage of its properties. Start from the top right corner of the matrix:
- If the target is greater than the value in the current position, you can move down because all the values in the current row to the left are smaller than the target.
- If the target is smaller than the value in the current position, you can move left because all the values in the current column below are larger than the target.
- If you find the target, return true.
- If you reach the bounds of the matrix (leftmost column or bottom row) without finding the target, the target does not exist in the matrix.
Code:
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) {
int row = 0;
int col = *matrixColSize - 1;
while (row < matrixSize && col >= 0) {
if (matrix[row][col] == target) {
return true;
} else if (matrix[row][col] > target) {
col--;
} else {
row++;
}
}
return false;
}