leetcode 74.搜素二维矩阵
题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
输出: true
示例 2:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 13
输出: false
解题思路
这一题同《剑指offer》上的题,可是使用遍历的方式去查找是否还有目标值,这样的设计的流程时间复杂度为 O ( m × n ) O(m \times n) O(m×n),但是题目中给出了矩阵的特性,从左到右是升序,从上到下也是升序,并且每一行第一个数大于前一行最后一个数。可以按照这个特性,从右上角或者左下角可以是查询。比如从右上角开始查询,如果说当前的值比目标值小,那么肯定不在该行,因为每一行的元素是升序排列的,所以就直接跳到下一行进行查找;如果当前元素比目标值大,那么就可以排除右上角的所有的元素,这样的设计就可以很高效的判读是否含有目标值,时间复杂度为 O ( m + n ) O(m+n) O(m+n)。
下面举个例子
matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50]], target = 23
下面通过一个动画演示一下查找过程
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
// matrix矩阵是否为空
int rows = matrix.size();
int cols = 0;
if(rows == 0){
return false;
}
if(rows > 0){
cols = matrix[0].size();
}
if(cols == 0){
return false;
}
// 从矩阵的右上角开始查询
int row = 0;
int col = cols-1;
while(row < rows && col >= 0){
if(matrix[row][col] == target){ // 找到目标值,返回true
return true;
}
else if(matrix[row][col] > target){ // 大于target时,列的下标减一
col --;
}
else{ // 小于target时,直接进入下一行
row ++;
}
}
return false;
}
};
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步