题目链接:https://leetcode-cn.com/problems/search-a-2d-matrix-ii/
思路:
- 题目明确了从上到下与从左到右是递增的,比较容易联想到是用二分法
- 将每一行(或每一列)做了单独的一唯数组,对所有行(或所有列)进行二分查找,能找到就是true
- 怎么判断用行还是用列来做一唯数据:看行少还是列哩,想想最极端的情况:
int[1][999999]
,我们肯定不会用列来做二分查找的
代码(写得不好轻喷,有改进的地方也请大佬们指教)
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int row = matrix.length;
int column = matrix[0].length;
//判断要用行还是列来当一唯数组进行二分查找
if (row >= column) {
for (int columnNum = 0; columnNum < column; columnNum++) {
if (canFindFromColumn(matrix, columnNum, row, target)) {
return true;
}
}
} else {
for (int rowNum = 0; rowNum < row; rowNum++) {
if (canFindFromRow(matrix[rowNum], column, target)) {
return true;
}
}
}
return false;
}
private boolean canFindFromRow(int[] array, int column, int target) {
int left = 0;
int right = column - 1;
//如果目标值不在这个区间,也不用二分查找了
if (array[left] > target || array[right] < target) {
return false;
}
while (left < right) {
int middle = (left + right) / 2;
int tempTarget = array[middle];
if (tempTarget == target) {
return true;
} else if (tempTarget > target) {
right = middle - 1;
} else {
left = middle + 1;
}
}
return array[left] == target;
}
//如果目标值不在这个区间,也不用二分查找了
private boolean canFindFromColumn(int[][] matrix, int columnNum, int row, int target) {
int top = 0;
int bottom = row - 1;
if (matrix[top][columnNum] > target || matrix[bottom][columnNum] < target) {
return false;
}
while (top < bottom) {
int middle = (top + bottom) / 2;
int tempTarget = matrix[middle][columnNum];
if (tempTarget == target) {
return true;
} else if (tempTarget > target) {
bottom = middle - 1;
} else {
top = middle + 1;
}
}
return matrix[top][columnNum] == target;
}
}
附结果~