二分专题:74. 搜索二维矩阵

122 阅读2分钟

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

若将矩阵每一行拼接在上一行的末尾,则会得到一个升序数组,我们可以在该数组上二分找到目标元素。 代码实现时,可以二分升序数组的下标,将其映射到原矩阵的行和列上。

分析:

  1. 首先要判断matrix数组是否存在,即matrix.length
  2. 可以利用 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;
};

总结:

这是算法系列文章「二分专题」的相关题解