题目所属分类
从右上角出发往下遍历 倒是也可以二分
原题链接
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
代码案例:
输入: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
题解
从右上角出发,初始化i = 0,j = m - 1
1、若matrix[i][j] == target
,返回true
2、若matrix[i][j] > target
,向左走,j --
3、若matrix[i][j] < target
,向下走,i ++
4、如果出界,返回false
时间复杂度O(n + m )
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int n = matrix.length ;
int m = matrix[0].length ;
if(n == 0 || m == 0) return false;
int i = 0 , j = m -1 ;
while(i < n && j >= 0){
int t = matrix[i][j] ;
if(t == target) return true;
if(t < target) i ++ ;
else j-- ;
}
return false ;
}
}
还可以二分
二分
枚举每一行,由于每一行都是升序的,对每一行通过二分找到 小于等于 target
的最大值,若存在某一行中matrix[i][l] == target
,则直接返回true,否则返回false
时间复杂度 O(nlogm)
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length == 0 || matrix[0].length == 0) return false;
int n = matrix.length;
int m = matrix[0].length;
for(int i = 0;i < n;i ++)
{
int l = 0, r = m - 1;
while(l < r)
{
int mid = l + r + 1 >> 1;
if(matrix[i][mid] <= target) l = mid;
else r = mid - 1;
}
if(matrix[i][l] == target) return true;
}
return false;
}
}