zoukankan      html  css  js  c++  java
  • 38 搜索二维矩阵Ⅱ

    原题网址:https://www.lintcode.com/zh-cn/old/problem/search-a-2d-matrix-ii/#

    38. 搜索二维矩阵 II 

     

    讨论区 

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

    这个矩阵具有以下特性:

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

    考虑下列矩阵:

    [

        [1, 3, 5, 7],

        [2, 4, 7, 8],

        [3, 5, 9, 10]

    ]

    给出target = 3,返回 2

    挑战 

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

    标签 
     
    非挑战版思路:
    脑子驴了,看到排序数组(矩阵)的搜索问题第一时间想到的就是二分查找法……对每行进行二分查找统计个数,时间复杂度O(m×log(n))。
    AC代码:
    class Solution {
    public:
        /**
         * @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
         */
        int searchMatrix(vector<vector<int>> &matrix, int target) {
            // write your code here
            if (matrix.empty())
        {
            return 0;
        }
        int result=0;
        int rowSize=matrix.size();
        int colSize=matrix[0].size();
        if (target<matrix[0][0]||target>matrix[rowSize-1][colSize-1])
        {
            return result;
        }
    
        for (int i=0;i<rowSize;i++)
        {
            int begin=0,end=colSize-1,mid=begin+end/2;
            while(begin<=end)
            {
                if (target==matrix[i][mid])
                {
                    ++result;
                    break;
                }
                else if (target<matrix[i][mid])
                {
                    end=mid-1;
                    mid=(begin+end)/2;
                }
                else 
                {
                    begin=mid+1;
                    mid=(begin+end)/2;
                }
            }
        }
    
        return result;
        }
    };

    挑战版  参考:

    https://www.cnblogs.com/edisonchou/p/4737944.html   可以多看几遍

    https://blog.csdn.net/ljlstart/article/details/48517509

    利用给定矩阵的特点,可以从右上角走到左下角,也可以从左下角走到右上角。这样每次移动时要么剔除当前行要么剔除当前列。

    第一种,若当前点大于target,当前列-1,即判断matrix【row】【col-1】;

    若当前点小于target,当前行+1,即判断matrix【row+1】【col】;

    若当前点等于target,计数器加1,然后当前行+1,当前列-1;

    重复以上步骤直到左下角。

    AC代码:

    class Solution {
    public:
        /**
         * @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
         */
        int searchMatrix(vector<vector<int>> &matrix, int target) {
            // write your code here
            if (matrix.empty())
        {
            return 0;
        }
        int result=0;
        int rowSize=matrix.size();
        int colSize=matrix[0].size();
        if (target<matrix[0][0]||target>matrix[rowSize-1][colSize-1])
        {
            return result;
        }
        int i=0,j=colSize-1;
        while(i>=0&&i<rowSize&&j>=0&&j<colSize)
        {
            if (matrix[i][j]==target)
            {
                ++result;
                    ++i;
                    --j;    
            }
            else if (matrix[i][j]<target)
            {
                ++i;
                
            }
            else
            {
                --j;
            }
        }
        return result;
        }
    };
  • 相关阅读:
    bzoj 1217 [HNOI2003]消防局的设立 贪心
    bzoj 1124 [POI2008]枪战Maf 贪心
    bzoj 2525 [Poi2011]Dynamite 二分+树形dp
    搭建SpringMVC+MyBatis开发框架六
    搭建SpringMVC+MyBatis开发框架五
    搭建SpringMVC+MyBatis开发框架四
    搭建SpringMVC+MyBatis开发框架三
    搭建SpringMVC+MyBatis开发框架二
    搭建SpringMVC+MyBatis开发框架一
    Mac下安装Node.js
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/9064594.html
Copyright © 2011-2022 走看看