74.搜索二维矩阵
思路: 若将矩阵每一行拼接在上一行的末尾,则会得到一个升序数组,我们可以在该数组上二分找到目标元素。代码实现时,可以二分升序数组的下标,将其映射到原矩阵的行和列上。
答案:
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length;
int n = matrix[0].length;
int low = 0;
int high = m*n-1;
while(low <= high){
int mid = (high + low) / 2 ;
int midNum = matrix[mid/n][mid%n];
if(target > midNum){
low = mid+1;
}else if(target < midNum){
high = mid-1;
}else{
return true;
}
}
return false;
}
}
接下来看下这题的另一个变式
240. 搜索二维矩阵 II
思路: 这题和上一题不一样的点在于矩阵的规律是不一样的,这题矩阵中,每一行是升序的,每一列也是升序的,但不能保证每一行的第一个元素大于上一行的最后一个元素。既然每一行的第一个元素是这一行中最小的,且比上一行的第一个元素大,那么就可以以行中第一个元素的值作为判断点,如果目标值小于当前行的首元素,那么目标值绝对不可能在当前值的后面,只能前面几行,然后在将target与上一行的首元素比较,如果还是target更下,那么继续上一行,以此类推;如果说在某一行比较的时候,target大于该行的首元素,那就然后target和当前行中其他列的元素匹配。
答案:
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int row = matrix.length-1;
int col = 0;
while(row>=0 && col<matrix[0].length){
if(target < matrix[row][col]){
row--;
}else if(target > matrix[row][col]){
col++;
}else{
return true;
}
}
return false;
}
}
|