搜索二维矩阵 II

描述

写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数。

这个矩阵具有以下特性:

 

  • 每行中的整数从左到右是排序的。
  • 每一列的整数从上到下是排序的。
  • 在每一行或每一列中没有重复的整数。

 

样例

考虑下列矩阵:

[

    [1, 3, 5, 7],

    [2, 4, 7, 8],

    [3, 5, 9, 10]

]

给出target = 3,返回 2

挑战

要求O(m+n) 时间复杂度和O(1) 额外空间

方法1.从最左边开始遍历,如果target在这一行的范围,那么可以从这一行的0遍历至最后。

            如果不在这一行内,那么进入下一行开始查找。

            如果该行的第一个数matrix[i][0]比target大,那么说明已经遍历完成,不用查找了。

代码如下:

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if(matrix.length==0||matrix[0].length==0)return 0;
        int count=0;
       for(int i=0;i<matrix.length;i++){
           if(matrix[i][0]<=target&&matrix[i][matrix[0].length-1]>=target){
              for(int j=0;j<matrix[0].length;j++){
                  if(matrix[i][j]==target)count++;
              }
           }else if(matrix[i][0]>target)break;
       }
        return count;
    }
}

方法2:从左下角遍历至右上角,如果target==遍历数字,那么去查找这个数的右上方(x--,y++),如果遍历数字>target,那么去上一行查找(X--).

public class Solution {
    /**
     * @param matrix: A list of lists of integers
     * @param target: An integer you want to search in matrix
     * @return: An integer indicate the total occurrence of target in the given matrix
     */
    public int searchMatrix(int[][] matrix, int target) {
        if(matrix.length==0||matrix[0].length==0)return 0;
        int count=0;
       int row=matrix.length;
       int col=matrix[0].length;
       int x=row-1,y=0;
       while(x>=0&&y<col){
           if(target==matrix[x][y]){
               x--;y++;count++;
           }else if(target>matrix[x][y]){
               y++;
           }else{
               x--;
           }
       }
       return count;
    }
}

 

posted @ 2018-08-30 09:59  吃土豆鸭  阅读(140)  评论(0编辑  收藏  举报