240. 搜索二维矩阵 II 和74. 搜索二维矩阵
74. 搜索二维矩阵
题目
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
思路
这个二维数组就是展开以后就是一个一维的有序数组,那么,用最基本的二分查找就可以了。当然,还有更精妙的解法,参考官方题解吧
代码
public boolean searchMatrix(int[][] matrix, int target) {
int n = matrix.length;
if(n==0){
return false;
}
int m = matrix[0].length;
int l = 0;
int r = n*m-1;
while(l<=r){
int mid = (l+r)>>1;
int row = mid/m;
int col = mid%m;
if(matrix[row][col]<target){
l = mid+1;
}else if(matrix[row][col]>target){
r = mid-1;
}else{
return true;
}
}
return false;
}
240. 搜索二维矩阵 II
题目
编写一个高效的算法来搜索 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。
给定 target = 20,返回 false。
思路
有很多种方法,这里介绍一种比较巧妙的
从左上角开始遍历数组,如果小于目标值,则向下走,如果大于目标数,则向右走。不能向上或者向左走。遍历,直到找到目标元素,或者遍历完,找不到元素。
时间复杂度,O(N+M),这种方法还是很巧妙的。
代码
public boolean searchMatrix(int[][] matrix, int target) {
int n = matrix.length;
if(n==0){
return false;
}
int m = matrix[0].length;
int i = 0;
int j = m-1;
while(i<n && j>=0){
if(matrix[i][j]<target){
i++;
}else if(matrix[i][j]==target){
return true;
}else{
j--;
}
}
return false;
}