74. 搜索二维矩阵
Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。 每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出: true
具体题目链接: 题目链接
思路:
思路:二分题目的思路:
确定二分边界
编写二分的代码框架
设计一个check(性质)
判断一下区间如何更新
如果更新方式写的是l=mid,r=mid-1,那么就在算mid的时候加上1
若将矩阵每一行拼接在上一行的末尾,则会得到一个升序数组,我们可以在该数组上二分找到目标元素。 代码实现时,可以二分升序数组的下标,将其映射到原矩阵的行和列上。
分析:
- 首先要判断matrix数组是否存在,即matrix.length
- 可以利用
i=mid/y;获取 j=mid%y;(m是列数)来确定元素对应的数组下标
代码:
var searchMatrix = function(matrix, target) {
if(!matrix) return false;
//一般二维数组先获取行,再获取对应列数
let x = matrix.length;//行数
let y = matrix[0].length;//列数
let left = 0;
let right = x * y - 1;
while(left<right) {
let mid = Math.floor(left + (right-left)/2);
// 这里不需要考虑边界值,即使用左边界有边界都行
if(matrix[Math.floor(mid / y)][mid % y]>=target) {//这里是将二维矩阵变成了一维矩阵来做
right = mid;
}else {
left = mid+1;
}
}
// 这里不是mid而是left
if(matrix[Math.floor(left / y)][left % y]!==target) return false;
return true;
};
总结:
这是算法系列文章「二分专题」的相关题解