CASE1:思想:分治法:
矩阵左下角那个元素既是它所在那行的最小元素也是他所在那列的最大元素,所以说以其作为突破口
当左下角元素==target时return true
<target时 往右走
>target时 往上走
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int rows = matrix.length;
int row = 0;
int col = (rows>0)?matrix[0].length-1:0;
while(row<rows&&col>=0){
if(matrix[row][col]==target) return true;
if(matrix[row][col]<target){
row++;
}else{
col--;
}
}
return false;
}
}
CASE 2:使用跳表思想结合二分查找
step1:对行进行二分查找,该下标idx即为在该行中插入target时的下标!!!,判断idx是否合法
如果合法(idx<col不用判断idx是否>=0因为二分法返回的idx恒>=0)直接判断该行下标为idx的元素是否为target,不是则转step2;
不合法(idx>=cols||idx==0时)做相应处理:
1)若idx=0则表示待查找元素要么小于该行的第一个元素即不存在要么等于第一个元素, 所以直接return matrix[r][idx]==target
2)若idx>=col,则表示待查找元素>该行所有元素则进入下一行
step2:再对下一行指定范围内做二分查找重复上述步骤
即判断if(matrix[r+1][idx]==target) return true;
if(matrix[r+1][idx]<target) binarySearch(matrix[r+1],0,idx+1,target)
if(matrix[r+1][idx]>target) binarySearch(matrix[r+1],idx+1,cols,target)
class Solution {
/*
*/
public int binarySearch(int[]temp,int start,int end,int target){
//至少有元素时才进行二分
if(start<=end){
int mid = (start+end)/2;
if(temp[mid]==target) return mid;
if(temp[mid]<target){
return binarySearch(temp,mid+1,end,target);
}
return binarySearch(temp,start,mid-1,target);
}
return start;
}
public boolean searchMatrix(int[][] matrix, int target) {
int r = 0;
int rows = matrix.length;
int start = 0;
int col = (rows>0)?matrix[0].length:0;
if(col==0) return false;
int end = col-1;
int idx = 0;
int temp = 0;
while(r<rows){
idx = binarySearch(matrix[r],start,end,target);
//
if(idx==0){
return matrix[r][idx]==target;
}
else if(idx>=col){
r++;
}else{
//特别注意这里若idx合法则直接判断就行了
if(matrix[r][idx]==target) return true;
else if(matrix[r][idx]<target){
start = idx+1;
r++;
}else{
end = idx-1;
r++;
}
}
}
return false;
}
}