题目:
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
- Integers in each row are sorted from left to right.
- The first integer of each row is greater than the last integer of the previous row.
For example,
Consider the following matrix:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
Given target =3, returntrue.
题意:
编写一个搜索mxn矩阵值的有效算法。该矩阵具有如下性质:
每一行中的整数都是从左到右排序的。
每一行的第一个整数都大于前一行的最后一个整数。
解题思路:
一眼看过去,发现是有序的,而且给定数字查找其是否存在,那么用折半查找那是稳稳的
但是这里是个二维数组,我们平常的折半查找都是一维数组的,所以我们这里可以把这题分为两步走战略
第一步先查找行,先查到这个数在哪一行
然后通过该行再进行查找列就行
也就是写两次折半查找就ok,思路就是这么简单
下面给出代码:
public static boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length <= 0 || matrix[0].length <= 0 ) {
return false;
}
int lowRow = 0;
int highRow = matrix.length-1;
while(lowRow <= highRow) {
int mid = (lowRow + highRow)/2;
if(matrix[mid][0] == target){
return true;
}
if(target > matrix[mid][0] ) {
lowRow = mid +1;
}
else {
highRow = mid -1;
}
}
if(highRow < 0)
return false;
int lowClo = 0;
int highClo = matrix[0].length-1;
while(lowClo <= highClo) {
int mid = (lowClo + highClo)/2;
if(matrix[highRow][mid] == target)
return true;
if(target > matrix[highRow][mid] ) {
lowClo = mid + 1;
}
else {
highClo = mid - 1;
}
}
return false;
}