描述
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
示例 1:
输入: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
输出:true
示例 2:
输入: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
输出:false
提示:
m == matrix.length
n == matrix[i].length
1 <= n, m <= 300
-109 <= matrix[i][j] <= 109
每行的所有元素从左到右升序排列
每列的所有元素从上到下升序排列
-109 <= target <= 109
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/search-a-2d-matrix-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
这个问题的解决方法是从矩阵的右上角开始搜索,如果当前元素等于目标元素,则返回true。如果当前元素大于目标元素,则向左移动一列;如果当前元素小于目标元素,则向下移动一行。由于矩阵的行和列都是按照升序排列的,因此这种搜索方法可以快速地找到目标元素,时间复杂度为O(m+n)。
C++代码
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m = matrix.size();
if (m == 0) return false; // 如果矩阵为空,则返回false
int n = matrix[0].size();
int row = 0, col = n - 1; // 从矩阵右上角开始搜索
while (row < m && col >= 0) { // 只要row和col的值在矩阵范围内,就继续搜索
if (matrix[row][col] == target) { // 如果找到目标元素,则返回true
return true;
} else if (matrix[row][col] > target) { // 如果当前元素大于目标元素,则向左移动一列
col--;
} else { // 如果当前元素小于目标元素,则向下移动一行
row++;
}
}
return false; // 如果搜索完整个矩阵都没有找到目标元素,则返回false
}
};