312,搜索二维矩阵 II
作者:互联网
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
-
每行的元素从左到右升序排列。
-
每列的元素从上到下升序排列。
示例:
现有矩阵 matrix 如下:
[
[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 = 5,返回 true。
给定 target = 20,返回 false。
答案:
1public boolean searchMatrix(int[][] matrix, int target) {
2 if (matrix == null || matrix.length < 1 || matrix[0].length < 1) {
3 return false;
4 }
5 int col = matrix[0].length - 1;//列
6 int row = 0;//行
7 while (col >= 0 && row <= matrix.length - 1) {
8 if (target == matrix[row][col]) {
9 return true;
10 } else if (target < matrix[row][col]) {
11 col--;
12 } else if (target > matrix[row][col]) {
13 row++;
14 }
15 }
16 return false;
17}
解析:
因为矩阵的行和列都是排过序的,从右上角开始找,如果当前值比要找的值大则往前一列开始找,如果当前值比要找的值小则往下一行找,如果等于则直接返回。当然我们还可以从左下角开始找,代码如下
1public boolean searchMatrix(int[][] matrix, int target) {
2 if (matrix == null || matrix.length < 1 || matrix[0].length < 1) {
3 return false;
4 }
5 int col = 0;//列
6 int row = matrix.length - 1;//行
7 while (row >= 0 && col <= matrix[0].length - 1) {
8 if (target == matrix[row][col]) {
9 return true;
10 } else if (target < matrix[row][col]) {
11 row--;
12 } else if (target > matrix[row][col]) {
13 col++;
14 }
15 }
16 return false;
17}
那么能不能从左上角开始走呢,也可以,但代码可能就有点复杂了,因为可能会出现往回走的情况,所以不如上面两种方法简单。这里有个规律,就是当前值是小于他右边的同时又是小于他下边的,所以任何一个值都会小于他右下角的值而大于他左上角的值(如果有),对于任何一个值,和他的左下角以及右上角的值是没法判断大小的。
标签:return,matrix,int,312,矩阵,II,target,col,row 来源: https://blog.51cto.com/u_4774266/2902538