zoukankan      html  css  js  c++  java
  • 搜索二维矩阵 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;
        }
    }
  • 相关阅读:
    Android拍照、摄像方向旋转的问题 代码具体解释
    Java 实现桥接(Bridge)模式
    C++标准I/O库:iostream, fstream, sstringstream
    Android 使用 DownloadManager 管理系统下载任务的方法
    JavaScript提高:005:ASP.NET使用easyUI TABS标签显示问题
    使用c++的cocos2d-x-3.0rc1程序公布apk
    UVA 146 ID Codes(下一个排列)
    C/C++:C++伪函数
    开源项目AndroidUtil-採用Fragment实现TabHost
    系统编程是什么
  • 原文地址:https://www.cnblogs.com/patatoforsyj/p/9558389.html
Copyright © 2011-2022 走看看