写在前面
对于二维矩阵,做了这么多,再熟悉不过了。但是这一次还是栽了。我本来一看到什么二维矩阵,数组,现在就直接联想到动态规划这种。这道题震惊我的地方,在于超人的洞察力,发现了其中的奥秘,我竟然没有发现,太菜了。这篇博文就单纯的做一些记录,不说其他的,因为思路是一点就透的那种,就当做以后如果碰到类似的思路,能够一眼看穿吧。
题目描述
思路介绍
数组从左到右和从上到下都是升序的,如果从右上角出发开始遍历呢?会发现每次都是向左数字会变小,向下数字会变大,有点和二分查找树相似。二分查找树的话,是向左数字变小,向右数字变大。所以我们可以把 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;
}