74,搜索二维矩阵
题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
题解
思路1:
代码:
使用两次二分查找
/**
两个二分查找
一个是:从矩阵的最后一排进行判断
找到是哪一行的数字
然后对该行的数字进行二分查找
*/
var searchMatrix = function(matrix, target) {
const row = matrix.length, col = matrix[0].length
// 先对最后一列进行二分查找
let l = 0, r = row - 1
while(l <= r){
let m = Math.floor((l + r)/2)
if(matrix[m][col - 1] >= target){
r = m - 1
}else{
l = m + 1
}
}
let temp = l
// 得到的r就是该数在某一行的范围
l = 0, r = col - 1
while(temp <= row - 1 && l <= r){
let m = Math.floor((l + r)/2)
if(matrix[temp][m] == target){
return true
}else if(matrix[temp][m] > target){
r = m - 1
}else{
l = m + 1
}
}
return false
};
2,使用一次二分查找
/**
对于二维矩阵的特点,将每一行串起来是一个升序序列 因此就可以进行一次二分查找
*/
var searchMatrix = function(matrix, target){
const row = matrix.length, col = matrix[0].length
const count = row * col
// 对于初始值,一个是第一个,一个是最后一个
let l = 0, r = count - 1
while(l <= r){
// 找打中间的数,m就是在整个排序的字符串是第几个的意思
let m = Math.floor((l + r) / 2)
// 对于第m个映射到数组的下标值计算
let currRow = Math.floor(m / col),currCol = m % col
// 判断是否有相等的值
if(matrix[currRow][currCol] == target){
return true
}else if (matrix[currRow][currCol] > target){
r = m - 1
}else {
l = m + 1
}
}
return false
}