1 题目理解
输入:一个mxn的int数组matrix,这个数组每一行按照从小到大排序,并且下一行的第一个值大于上一行的最后一个值。一个int值target
返回:target在matrix中是否存在。存在返回true。
2 二分
我们可以把这个数组看做是一个有序数组。数组下表从0到m*n-1。
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix==null || matrix.length==0 || matrix[0].length==0) return false;
int l = 0;
int r = matrix.length*matrix[0].length-1;
int cols = matrix[0].length;
while(l<=r){
int m = l + ((r-l)>>1);
int row = m/cols;
int col = m%cols;
if(matrix[row][col]==target) return true;
if(matrix[row][col]>target){
r = m - 1;
}else{
l = m + 1;
}
}
return false;
}
}
也可以先在第一列查找,找到最小的比target大的元素,所在的行l,然后在l-1行查找target是否存在。
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length==0 || matrix[0].length==0) return false;
int m = matrix.length;
int n = matrix[0].length;
//先在第一列找,l是nums[l]>target的最小值
int l = 0, r = m-1;
while(l<=r){
int middle = l+((r-l)>>1);
if(matrix[middle][0] == target) return true;
if(matrix[middle][0]>target){
r = middle-1;
}else{
l = middle+1;
}
}
if(l>0){
int line = l-1;
//在line这一行查找
l = 0;
r = n-1;
while(l<=r){
int middle = l +((r-l)>>1);
if(matrix[line][middle]==target) return true;
if(matrix[line][middle]>target){
r = middle-1;
}else{
l = middle+1;
}
}
return false;
}else{
return false;
}
}
}