编写一个高效的算法来判断 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
解题思路:
先对第一列元素进行二分,确定目标值可能存在的行line,然后对该行元素进行二分,查找目标值。
java代码:
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(null == matrix || 0 == matrix.length || 0 == matrix[0].length)
return false;
int m = matrix.length, n = matrix[0].length;
if(target < matrix[0][0] || target > matrix[m-1][n-1])
return false;
//确定目标值可能存在的行line
int start = 0, end = m-1,middle = 0;
while(start <= end) {
middle = (start + end) >> 1;
if(matrix[middle][0] == target)
return true;
if(matrix[middle][0] > target)
end = middle-1;
else
start = middle+1;
}
int line = start-1;
start = 0;end = n-1;
while(start <= end) {
middle = (start + end) >> 1;
if(matrix[line][middle] == target)
return true;
if(matrix[line][middle] > target)
end = middle-1;
else
start = middle+1;
}
return false;
}
}