题目描述
解题思路
思路一:先取第一行,使用二分法确定target所在行数,其次再对确定的行使用二分法寻找target值,如果找到则返回true,否则false。
不足:超出时间限制。
未考虑完全的点:首行中,比target小的值所在的列都有可能存在target,不应该只有固定行对应的列,而是一个范围进行搜索。从而确定固定行对应的列以及固定列对应的行,这样搜索才是全面的。
思路二:参考其他的方法,从右上角看,实际上是一棵二叉搜索树,目标值小的话往左走,目标值更大的话往下走。
代码实现
思路一代码:
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int row=matrix.length;
int col=matrix[0].length;
// // 提取第一行的数据,来判断target在第几行
// int[] col_num=new int[col];
// for(int i=0;i<col;i++){
// col_num[i]=matrix[0][i];
// }
int left=0;
int right=col-1;
while(left<right){
if(matrix[0][(left+right)/2]>target){
right=(left+right)/2;
}
else {
left=(left+right)/2;
}
}
// 此时left是我们需要的定位行
if(matrix[0][left]==target||matrix[0][right]==target) return true;
int tag=left;
left=0;
right=row-1;
while(left<right){
if(matrix[(left+right)/2][tag]>target){
right=(left+right)/2;
}
else {
left=(left+right)/2;
}
}
// 此时left是我们需要的定位行
if(matrix[left][tag]==target||matrix[right][tag]==target) return true;
return false;
}
}
思路二代码:
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int rowl=matrix.length;
int coll=matrix[0].length;
int row=0,col=matrix[0].length-1;
while(col>=0 && row< rowl){
if(matrix[row][col]>target)
{
col--;
}
else{
if(matrix[row][col]==target)
{
return true;
}
row++;
}
}
return false;
}
}
心得:永远不要放弃,永远会有更奇妙的方法在等着你。