Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
- Integers in each row are sorted in ascending from left to right.
- Integers in each column are sorted in ascending from top to bottom.
For example,
Consider the following 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] ]
Given target = 5
, return true
.
Given target = 20
, return false
.
和search a 2d matrix的不同在于,这道题中的数字是可能重复的,每行的第一个数字不一定比上一行的最后一个数字大,所以不能直接用binary search,观察数组发现,左下角和右上角的数字很有特点,左下角的数字是这一列最大的 + 这一行最小的,可以根据这个条件从左下角开始搜素,如果比target小则向同行右边搜素,如果比target小则向同列上方搜索(同样道理也可以从右上角开始搜素)
1.java
{
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null){
return false;
}
int height = matrix.length - 1;
if(height < 0){
return false;
}
int width = matrix[0].length - 1;
int start = 0;
while(start <= width&&height>=0){
if(matrix[height][start]<target){
start++;
}
else if(matrix[height][start] > target){
height--;
}
else{
return true;
}
}
return false;
}
}
2.python
def searchMatrix(self, matrix, target):
# write your code here
if not matrix:
return 0
m = len(matrix)
n = len(matrix[0])
row = 0
col = n - 1
count = 0
while row < m and col >= 0:
if matrix[row][col] == target:
count += 1
col -= 1
elif matrix[row][col] < target:
row += 1
else:
col -= 1
return count