写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数。
这个矩阵具有以下特性:
- 每行中的整数从左到右是排序的。
- 每一列的整数从上到下是排序的。
- 在每一行或每一列中没有重复的整数。
思路:
参考剑指offer:
从右上角顶点算起,先比较列,如果当前元素大于target,则col--;
然后开始比较行,如果当前元素小于target,则row++。
代码:
public static int searchMatrix(int[][] matrix, int target) {
// write your code here
if(matrix==null||matrix.length==0){
return 0;
}
int tr = 0, tc = 0;
int dr = matrix.length-1, dc = matrix[0].length-1; //左上角,右下角,先把矩阵框起来
int wr = 0, wc = dc; // 工作位
int count = 0; // 计数位
while(wc>=tc && wr<=dr){
if(matrix[wr][wc]!=target){
while(wc>=tc && wr<=dr &&matrix[wr][wc]>target){ // 削减列数 注意可行条件
wc--;
}
while(wc>=tc && wr<=dr&&matrix[wr][wc]<target){ // 削减行数
wr++;
}
}else{
count++;
wc--;
wr++;
}
}
return count;
}
代码实现时喜欢先用矩阵的左上角跟右下角把矩阵框起来,然后设置工作位依次执行操作。