又是一道有点脑筋急转弯的意思,只需要考虑砍掉一行或一列就行了,不需要移动指针去搜索哦
为什么不要从左上角
和右下角
开始搜索?
先来看一下右上角
为什么可以:
- 对于行来说,从左往右
递增
,如果target
大于
右上角,比最大的还要大,砍掉那一行 - 对于列来说,从上到下
递增
,如果target
小于
右上角,比最小的还要小,砍掉那一列
public boolean searchMatrix(int[][] matrix, int target) {
int rows = matrix.length;
int columns = matrix[0].length;
int i = 0;
int j = columns - 1;
while (i < rows && j >= 0) {
if (matrix[i][j] == target) {
return true;
}
if (target > matrix[i][j]) {
i++;
} else {
j--;
}
}
return false;
}
再来看一下左下角
为什么可以:
- 对于行来说,从左到右
递增
,如果target
大于
左下角,往右寻找 - 对于列来说,从下到上
递减
,如果target
小于
左下角,比最小的还要小,砍掉那一行
public boolean searchMatrix(int[][] matrix, int target) {
int rows = matrix.length;
int columns = matrix[0].length;
int i = rows - 1;
int j = 0;
while (i >= 0 && j < columns) {
if (matrix[i][j] == target) {
return true;
}
if (target < matrix[i][j]) {
i--;
} else {
j++;
}
}
return false;
}
再来看一左上角
和右下角
为什么不可以:
沿着行和列都是递增或递减,其实可以的,但是代码就不是这个画风了,时间复杂度也是O(mn)
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int rows = matrix.length;
int columns = matrix[0].length;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
if (matrix[i][j] == target) {
return true;
}
if (matrix[i][j] > target && i < rows - 1) {
if (j == 0) {
return false;
}
for (int row = i + 1, k = j - 1; k < columns; k++) {
if (matrix[row][k] == target) {
return true;
}
if (matrix[row][k] > target) {
break;
}
}
break;
}
}
}
return false;
}
}