【力扣每日一题、74搜索二维矩阵】二分查找法在二维数组上的应用

原题链接

题目

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

  • 每行中的整数从左到右按升序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

示例

在这里插入图片描述
在这里插入图片描述

解题思路

早上起来看力扣每日一题,看到只是搜索某值,这该是个简单题的。原本我还理解错意思了,以为要判断是增矩阵和找到target,哈哈。后来只是要查找到target就行了,如果暴力的直接两层for循环就可以搞定。但是题目给的明显是有顺序的二维数组,我们直接使用二分查找法,二分查找法在一维数组上写起来很容易,但是在二维数组下要学会转换思路。其实我们可以把二维数组看成一维数组,比如下面这个。这位作者总结的很到位,把二分法从头到尾总结了一遍,十分详细,在这里引用其一部分。

下面我们来看一下另外一种变体,如何在二维矩阵里使用二分查找呢?
其实这个很简单,只要学会了二分查找,这个完全可以解决,我们先来看一个例子
我们需要从一个二维矩阵中,搜索是否含有元素 7,我们如何使用二分查找呢?其实我们可以完全将二维矩阵想象成一个有序的一维数组,然后用二分,,比如我们的二维矩阵中,共有 9 个元素,那定义我们的 left = 0,right = 9 - 1= 8,是不是和一维数组定义相同,然后我们求我们的 mid 值, mid = left +((right - left) >> 1)此时 mid = 4 ,但是我们的二维矩阵下标最大是,nums[2,2]呀,你这求了一个 4 ,让我们怎么整呀。如果我们理解了二分查找,那么这个题目考察我们的应该是如何将一维数组的下标,变为 二维坐标。其实也很简单,咱们看哈,此时咱们的 mid = 4,咱们的二维矩阵共有 3行, 3列,那我们 mid =4,肯定在第二行,那么这个应该怎么求得呢?
我们可以直接用 (mid/列数),即可,因为我们 mid = 4,4 /3 = 1,说明在 在第二行,那如果 mid = 7 ,7/3=2,在第三行,我们第几行知道了,那么我们如何知道第几列呢?我们可以直接根据 (mid % 列数 )来求得呀,比如我们此时 mid = 7,7%3 = 1,那么在我们一维数组索引为 7 的元素,其处于二维数组的第2列,大家看看下图是不是呀!
作者:yuan-chu-de-suan-fa-xiao-wu
链接:https://leetcode-cn.com/problems/search-a-2d-matrix/solution/yi-wen-dai-ni-gao-ding-duo-ge-er-fen-cha-2hl9/
来源:力扣(LeetCode)
在这里插入图片描述

代码

public boolean searchMatrix(int[][] matrix, int target) {
    
    
    if (matrix.length == 0) {
    
    
         return false;
     }
     //行数
     int row = matrix.length;
     //列数
     int col = matrix[0].length;
     int left = 0;
     //行数乘列数 - 1,右指针
     int right = row * col - 1;
     while (left <= right) {
    
    
         int mid = left+ ((right-left) >> 1);
         //将一维坐标变为二维坐标
         int rownum = mid / col;
         int colnum = mid % col;
         if (matrix[rownum][colnum] == target) {
    
    
              return true;
         } else if (matrix[rownum][colnum] > target) {
    
    
             right = mid - 1;
         } else if (matrix[rownum][colnum] < target) {
    
    
             left = mid + 1;
         }
     }
     return false;
  }

拓展

如果二维数组是S型增长的代码该怎么写呢?

猜你喜欢

转载自blog.csdn.net/VanGotoBilibili/article/details/115318034
今日推荐