LeetCode——74. 搜索二维矩阵[Search a 2D Matrix][中等]——分析及代码[Java]
一、题目
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
- 每行中的整数从左到右按升序排列。
- 每行的第一个整数大于前一行的最后一个整数。
示例 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.length
- n == matrix[i].length
- 1 <= m, n <= 100
- -10^4 <= matrix[i][j], target <= 10^4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-a-2d-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 二分查找
(1)思路
对有序矩阵,直接按行、列分别进行二分查找。
(2)代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int n = matrix.length, m = matrix[0].length;
if (matrix[0][0] > target || matrix[n - 1][m - 1] < target)
return false;
//二分求行
int l = 0, r = n;
while (l < r - 1) {
int mid = (l + r) >> 1;
if (matrix[mid][0] <= target)
l = mid;
else
r = mid;
}
int i = l;
//二分求列
l = 0;
r = m;
while (l < r - 1) {
int mid = (l + r) >> 1;
if (matrix[i][mid] <= target)
l = mid;
else
r = mid;
}
//判断第一个不小于target的数是否等于target
return matrix[i][l] == target;
}
}
(3)结果
执行用时 :0 ms,在所有 Java 提交中击败了 100.00% 的用户;
内存消耗 :37.7 MB,在所有 Java 提交中击败了 93.70% 的用户。
三、其他
本题也可将矩阵中的元素逐列逐行综合编号(i * m + j),通过一次二分查找得到结果。