给你一个满足下述两条属性的 m x n 整数矩阵:
- 每行中的整数从左到右按非严格递增顺序排列。
- 每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。
示例 1:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例 2:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false
提示:
m == matrix.lengthn == matrix[i].length1 <= m, n <= 100-104 <= matrix[i][j], target <= 104
核心思路:(二分查找法)
1.把二维数组"展开"成一维数组
左边界下标=0,右边界下标是所有元素-1
n x m矩阵数组 有 n x m个元素
2.计算中间值,找出矩阵的中间位置(left+right)/2
3.根据位置找出所在行和列
行:中间值 / 列数 Math.floor向下取整
列:中间值 % 列数
4.比较中间值和目标值;
大了,右边界缩小至mid-1
小了,左边界扩长至mid+1
TypeScript
function searchMatrix(matrix: number[][], target: number): boolean {
const n = matrix.length
const m = matrix[0].length
let left = 0
let right = n * m - 1
while(left <= right){
const mid = Math.floor((left + right) / 2)
let i = Math.floor(mid / m)
let j = mid % m
const midValue = matrix[i][j]
if(midValue === target){
return true
}else if(midValue > target){
right = mid - 1
}else{
left = mid + 1
}
}
return false
};
共勉