- 题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:每行中的整数从左到右按升序排列;每行的第一个整数大于前一行的最后一个整数。
提示:
m = matrix.length
n = matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104
来源:LeetCode
- 示例
- 示例 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
- 思路分析
很简单的一道题。因为二维数组每一行有序,行与行之间也是有序的,因此首先找到这个数可能在哪一行,再二分查找这一行即可。
- JAVA实现
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int id = 0;
if(target<matrix[0][0] || target>matrix[matrix.length-1][matrix[0].length-1]) return false; //判断是否在二维数组的范围内,与最小值(左上角的数)和最大值(右下角的数)相比
for(int i=0; i<matrix.length; i++) {
if(target <= matrix[i][matrix[0].length-1]) { //和这一行的最后一个数相比,如果小于等于,说明在这一行范围内
id = i;
break;
}
}
int start = 0, end = matrix[0].length-1;
while(start <= end) { //二分查找
int mid = (start + end) / 2;
if(target == matrix[id][mid]) return true;
else if(target < matrix[id][mid]) end = mid - 1;
else start = mid + 1;
}
return false;
}
}