搜索二维矩阵(左右上下升序,寻找目标值)

301 阅读2分钟

写在前面

对于二维矩阵,做了这么多,再熟悉不过了。但是这一次还是栽了。我本来一看到什么二维矩阵,数组,现在就直接联想到动态规划这种。这道题震惊我的地方,在于超人的洞察力,发现了其中的奥秘,我竟然没有发现,太菜了。这篇博文就单纯的做一些记录,不说其他的,因为思路是一点就透的那种,就当做以后如果碰到类似的思路,能够一眼看穿吧。

题目描述

在这里插入图片描述

思路介绍

数组从左到右和从上到下都是升序的,如果从右上角出发开始遍历呢?会发现每次都是向左数字会变小,向下数字会变大,有点和二分查找树相似。二分查找树的话,是向左数字变小,向右数字变大。所以我们可以把 target 和当前值比较。

  • 如果 target 的值大于当前值,那么就向下走。
  • 如果 target 的值小于当前值,那么就向左走。
  • 如果相等的话,直接返回 true 。

也可以换个角度思考。如果 target 的值小于当前值,也就意味着当前值所在的列肯定不会存在 target 了,可以把当前列去掉,从新的右上角的值开始遍历。同理,如果 target 的值大于当前值,也就意味着当前值所在的行肯定不会存在 target 了,可以把当前行去掉,从新的右上角的值开始遍历。看下边的例子。

[1,   4,  7, 11, 15],
[2,   5,  8, 12, 19],
[3,   6,  9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]

如果 target  = 9,如果我们从 15 开始遍历, cur = 15
    
target < 15, 去掉当前列, cur = 11
[1,   4,  7, 11],
[2,   5,  8, 12],
[3,   6,  9, 16],
[10, 13, 14, 17],
[18, 21, 23, 26]    
    
target < 11, 去掉当前列, cur = 7  
[1,   4,  7],
[2,   5,  8],
[3,   6,  9],
[10, 13, 14],
[18, 21, 23]     

target > 7, 去掉当前行, cur = 8   
[2,   5,  8],
[3,   6,  9],
[10, 13, 14],
[18, 21, 23]       

target > 8, 去掉当前行, cur = 9, 遍历结束    
[3,   6,  9],
[10, 13, 14],
[18, 21, 23] 

代码实现

public boolean searchMatrix(int[][] matrix, int target) {
    if (matrix == null) return false;
    if (matrix.length == 0) return false;
    if (matrix[0].length == 0) return false;
    
    int i = 0;
    int j = matrix[0].length - 1;
    
    while (i < matrix.length && j >=0) {
        if (target == matrix[i][j]) return true;
        else if (target < matrix[i][j]) j--;
        else i++;
    }
    return false;
}