这道题是让在一个二维数组里搜索特定的数
数组的行和列元素全部递增且上一行的最后一个元素小于下一行的第一个元素
这道题首先先搜索行,看看元素在哪一行,然后再到那一行里去找
即先搜索A[target][0], 在搜索A[row][target]
详见代码
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
return false;
int left = 0;
int right = matrix.length - 1;
while (left <= right) {
int middle = (left + right) / 2;
if (matrix[middle][0] == target)
return true;
if (matrix[middle][0] > target)
right = middle - 1;
else
left = middle + 1;
}
int row = right;
if (row < 0)
return false;
left = 0;
right = matrix[0].length - 1;
while (left <= right) {
int middle = (left + right) / 2;
if (matrix[row][middle] == target)
return true;
if (matrix[row][middle] > target)
right = middle - 1;
else
left = middle + 1;
}
return false;
}
首先在第一列中寻找元素在哪一行
int left = 0;
int right = matrix.length - 1;
while (left <= right) {
int middle = (left + right) / 2;
if (matrix[middle][0] == target)
return true;
if (matrix[middle][0] > target)
right = middle - 1;
else
left = middle + 1;
}
然后确定了行后再看元素在哪一列
int row = right;
if (row < 0)
return false;
left = 0;
right = matrix[0].length - 1;
while (left <= right) {
int middle = (left + right) / 2;
if (matrix[row][middle] == target)
return true;
if (matrix[row][middle] > target)
right = middle - 1;
else
left = middle + 1;
}
注意这里row一定要定义为right
因为当跳出循环的时候 left一定>right,所以right才是对应的行数。这个大家可以在纸上画一画就明白了。