写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数。
这个矩阵具有以下特性:
每行中的整数从左到右是排序的。
每一列的整数从上到下是排序的。
在每一行或每一列中没有重复的整数。
样例
考虑下列矩阵:
[
[1, 3, 5, 7],
[2, 4, 7, 8],
[3, 5, 9, 10]
]
给出target = 3,返回 2
挑战
要求O(m+n) 时间复杂度和O(1) 额外空间
法一:
public int searchMatrix(int[][] matrix, int target) {
if(null == matrix || matrix.length == 0 || matrix[0].length == 0) return 0;
int i = 0;
int j = matrix[0].length - 1;
int count = 0;
while(i < matrix.length && j >= 0) {
if(matrix[i][j] == target) {
count++;
i++;
j--;
}else if(matrix[i][j] > target){
j--;
}else{
i++;
}
}
return count;
}
法二:
public class Solution {
/**
* @param matrix: A list of lists of integers
* @param: A number you want to search in the matrix
* @return: An integer indicate the occurrence of target in the given matrix
*/
public int searchMatrix(int[][] matrix, int target) {
if(null == matrix || matrix.length == 0 || matrix[0].length == 0) return 0;
int m = matrix.length;
int n = matrix[0].length;
int l = 0, h = m - 1;
int line = -1;
int count = 0;
while(l <= h) {
int mid = (l + h)/2;
if(matrix[mid][0] == target) {
line = mid - 1;
count++;
break;
}else if(matrix[mid][0] > target) {
h = mid - 1;
}else {
l = mid + 1;
}
}
if(line == -1) line = l - 1;
for(int i = 0; i <= line; i++) {
l = 0;
h = n - 1;
while(l <= h) {
int mid = (l + h)/2;
if(matrix[i][mid] == target) {
count++;
break;
}else if(matrix[i][mid] > target) {
h = mid - 1;
}else {
l = mid + 1;
}
}
}
return count;
}
}