LeetCode-74-搜索二维矩阵
74. 搜索二维矩阵
难度中等
编写一个高效的算法来判断 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
-104 <= matrix[i][j], target <= 104
解题思路
既然这是一个查找元素的问题,并且数组已经排好序,我们自然可以想到用二分查找是一个高效的查找方式。
输入的 m x n 矩阵可以视为长度为 m x n的有序数组:
行列坐标为(row, col)的元素,展开之后索引下标为idx = row * n + col;反过来,对于一维下标为idx的元素,对应二维数组中的坐标就应该是:
row = idx / n; col = idx % n;
class Solution {
public boolean searchMatrix( int[][] matrix, int target ){
// 先定义m和n
int m = matrix.length;
if (m == 0) return false;
int n = matrix[0].length;
// 二分查找,定义左右指针
int left = 0;
int right = m * n - 1;
while ( left <= right ){
// 计算中间位置
int mid = (left + right) / 2;
// 计算二维矩阵中对应的行列号,取出对应元素
int midElement = matrix[mid/n][mid%n];
// 判断中间元素与target的大小关系
if (midElement < target)
left = mid + 1;
else if (midElement > target)
right = mid - 1;
else
return true;
}
return false;
}
}