一、题目
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
- 每行中的整数从左到右按升序排列。
- 每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
输出: true
示例 2:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 13
输出: false
二、思路——二分查找
根据题目描述的矩阵的特性,我们可以把这个 m x n 的矩阵看作长度为 m x n 的有序数组,对于有序数组,就可以用二分法进行查找。假设有序数组中某个元素的索引为 index,则对应在矩阵中的位置为 行 坐 标 : r o w = i n d e x / n 行坐标:row = index / n 行坐标:row=index/n 列 坐 标 : c o l = i n d e x % n 列坐标:col = index \% n 列坐标:col=index%n 其中 n = matrix[0].length。
三、代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length;
if(m == 0)
return false;
int n = matrix[0].length;
// 二分查找
int left = 0;
int right = m * n - 1;
int midIndex;
int midElement;
while(left <= right){
midIndex = (left + right) / 2;
midElement = matrix[midIndex / n][midIndex % n];
if(midElement == target)
return true;
else if(midElement < target)
left = midIndex + 1;
else
right = midIndex - 1;
}
return false;
}
}