题目:
Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
Output: true
标准答案solution1:
var searchMatrix = function(matrix, target) {
let m = matrix.length;
let n = matrix[0].length;
let left = 0;
let right = m * n - 1;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
let row = Math.floor(mid / n);
let col = mid % n;
if (matrix[row][col] === target) {
return true;
} else if (matrix[row][col] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return false;
};
自己写的~:
也是使用了二分法的思想,先分大的,再分小的,在每一个大的里面进行小的二分
function searchMatrix(matrix, target) {
let m=matrix.length;
let n=matrix[0].length;
let rowleft=0;
let rowright=m-1; //这是大的左右,是行
//先来大的
while(rowleft <= rowright){
let rowmid=Math.floor((rowleft+rowright)/2);
let colleft=0;
let colright=n-1; //这是里面的左右,
//因为是matrix,不是数组,所以每一行长度都一样
while(colleft<=colright){
let colmid=Math.floor((colleft + colright) / 2);
let val=matrix[rowmid][colmid];
if(val===target){
return true;
}
else if(val>target){
colright=colmid-1;
}
else{
colleft=colmid+1
}
}
if(matrix[rowmid][0]>target){
rowright=rowmid-1; //因为是升序!!
}
else{
rowleft=rowmid+1;
}
}
return false;
}