【算法学习】二维数组检索 search-a-2d-matrix(Java)

本文介绍了一种在有序矩阵中高效搜索目标值的算法。通过两次二分查找,首先确定目标值可能所在的行,再在该行中查找目标值,实现快速定位。

题目描述

请写出一个高效的在m*n矩阵中判断目标值是否存在的算法,矩阵具有如下特征:
每一行的数字都从左到右排序
每一行的第一个数字都比上一行最后一个数字大
例如:
对于下面的矩阵:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
要搜索的目标值为3,返回true;
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
Integers in each row are sorted from left to right.
The first integer of each row is greater than the last integer of the previous row.
For example,
Consider the following matrix:

示例
输入 [[1,1]],0
输出 false

二、思路分析

有序列表检索可以用二分查找,二分查找参考链接

此题给出二维矩阵,每一行的数字都从左到右排序,每一行的第一个数字都比上一行最后一个数字大。通俗的说就是把一个有序数组折成二维矩阵而已。

  • 思路1 空间允许的情况下,可以将二维数组转成一维数组。然后参考二分查找进行查找。
  • 思路2 此题保证了从每行从左到右有序,并且第二行的第一个元素大于第一行所有元素。可以采用两次二分查找进行检索。

三、参考代码

/**
  * 
  * @param matrix int整型二维数组 
  * @param target int整型 
  * @return bool布尔型
  */
 public static boolean searchMatrix(int[][] matrix, int target) {
     // 查找列所在行
     if (matrix.length < 1 || matrix[0].length < 1) {
         return false;
     }
     int rowNum = 0;
     if (matrix.length > 1) {
         int left = 0, right = matrix.length - 1;
         int mid = 0;
         while (left <= right) {
             mid = left + (right - left) / 2;
             if (matrix[mid][0] == target) return true;
             if (matrix[mid][0] < target) left = mid + 1;
             if (matrix[mid][0] > target) right = mid - 1;
         }
         rowNum = mid;
     }
     // 行查找
     int left = 0, right = matrix[rowNum].length - 1;
     int mid;
     while (left <= right) {
         System.out.println(left + "  " + right);
         mid = left + (right - left) / 2;
         if (matrix[rowNum][mid] == target) return true;
         if (matrix[rowNum][mid] < target) left = mid + 1;
         if (matrix[rowNum][mid] > target) right = mid - 1;
     }
     return false;
 }

通过以下网站测试:

牛客网测试连接

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鼠晓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值