思路:
这道题很有意思 从左到有升序,从上到下升序,斜边从左上到右下也是升序,从右上到做下降序。
如果是从左往右依次遍历,就会面临一个问题向右还是向下,因为都是大于当前值,不好决断,还有回退问题。
所以我们可以从右上开始遍历,对于在右上的元素,想左走依次变小,向下走依次变大,两条不一样的路,就很好找到目标值了。
- 如果当前元素大于目标值,我们知道目标值不可能在当前元素的右侧,因为右侧的所有值都比当前值大。因此,我们可以向左移动,排除当前列。
- 如果当前元素小于目标值,我们知道目标值不可能在当前元素的上方,因为上方的所有值都比当前值小。因此,我们可以向下移动,排除当前行。
- 这种方法的优点是每一步都可以排除一行或一列,从而以线性时间逼近目标值,减少了搜索所需的步骤数。
代码如下:
class Solution {
public static boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return false;
}
int row = 0;
int col = matrix[0].length - 1;
while (row < matrix.length && col >= 0) {
if (matrix[row][col] == target) {
return true;
} else if (matrix[row][col] > target) {
col--;
} else {
row++;
}
}
return false;
}
}