题目:
编写一个高效的算法来搜索 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
。
思路:
解法一:运行时间30ms,O(n^2)
双重for循环慢的一批。
public static boolean searchMatrix(int[][] matrix, int target) {
for(int i = 0;i < matrix.length-1;i++){
for(int j = 0;j < matrix[0].length-1;j++){
if(target == matrix[i][j]){
return true;
}
}
}
return false;
}
解法二:运行时间4ms O(n)
由于题目说了,从上到下 从左到右是升序,所以可以从左下角入手,比如我们找5,(5比20小)20右边比20大,上边比20小,所以向上搜索-----》14,再向上-------》8,再向上-------》4,4比5小,而4右边的比4大,所以向右搜索。------》7向上-------》3--------》4-------》5.找到。
public static boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length == 0) return false;
int x = 0;
int y = matrix[0].length -1;
while(x < matrix.length && y >= 0) {
if(target == matrix[x][y])
return true;
else if(target > matrix[x][y])
x++;
else
y--;
}
return false;
}