Leetcode 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。
解法1:
将每一行看作有序递增的数组,利用二分查找遍历
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix==null || matrix.length == 0 || (matrix.length ==1 && matrix[0].length == 0)) return false;
for(int i = 0;i<matrix.length;i++){
int low = 0;
int high = matrix[i].length-1;
while(low<=high){
int middle =low+((high-low)>>1);
if(matrix[i][middle]==target) return true;
else if(matrix[i][middle]>target) high = middle-1;
else if(matrix[i][middle]<target) low = middle+1;
}
}
return false;
}
}
解法2:
从右上角开始选取,如果target>右上角,则第一行可以删去,如果target<右上角,则最后一列可以删去,循环往复即可。
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0 || (matrix.length ==1 && matrix[0].length == 0)) return false;
int row = matrix.length;
int i = 0;
int j = matrix[0].length - 1;
while(i < row && j >= 0){
if(matrix[i][j] == target) return true;
if(matrix[i][j] < target) i++;
else j--;
}
return false;
}
}