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

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

    写出一个高效的算法来搜索 m × n矩阵中的值。

    这个矩阵具有以下特性:

    • 每行中的整数从左到右是排序的。
    • 每行的第一个数大于上一行的最后一个整数。
    样例

    考虑下列矩阵:

    [
      [1, 3, 5, 7],
      [10, 11, 16, 20],
      [23, 30, 34, 50]
    ]
    

    给出 target = 3,返回 true

    挑战 

    O(log(n) + log(m)) 时间复杂度

    #include <iostream>
    #include <vector>
    #include <math.h>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    //方法一:展开成一维数组,二分法查找;
    bool searchMatrix(vector<vector<int>> &matrix, int target)
    {
        if (matrix.empty())
        {
            return false;
        }
        int row=matrix.size();
        int col=matrix[0].size();
    
        if (target<matrix[0][0]||target>matrix[row-1][col-1])
        {
            return false;
        }
    
        vector<int> temp;
        for (int i=0;i<row;i++)
        {
            for (int j=0;j<col;j++)
            {
                temp.push_back(matrix[i][j]);
            }
        }
        //二分法查找;
        int size=temp.size();
        int count=0;
        int max=size-1,mid=size/2,min=0;  //mid=(max+min)/2;
    
        while(count!=size)
        {
            if (target==temp[mid])
            {
                return true;
            }
            else if (target<temp[mid])
            {
                max=mid-1;
            }
            else
            {
                min=mid+1;
            }
            mid=(max+min)/2;
            count ++;
        }
        return false;
    }
    
    
    //方法二:对行和列分别进行二分法查找;
    bool searchMatrix_w(vector<vector<int>> &matrix, int target)
    {
        if (matrix.empty())
        {
            return false;
        }
        int row=matrix.size();
        int col=matrix[0].size();
    
        if (target<matrix[0][0]||target>matrix[row-1][col-1])
        {
            return false;
        }
    
        //二分法查找行;
        int rowindex=0;
        int rowlow=0,rowhigh=row-1,rowmid=(rowhigh+rowlow)/2;
        while(rowlow<=rowhigh)
        {
            if (target==matrix[rowmid][0]||target==matrix[rowmid][col-1])
            {
                return true; 
            }
            else if (target>matrix[rowmid][0]&&target<matrix[rowmid][col-1])
            {
                rowindex=rowmid;
                break;
            }
            else if (target<target>matrix[rowmid][0])
            {
                rowhigh=rowmid-1;
            }
            else
            {
                rowlow=rowmid+1;
            }
            rowmid=(rowhigh+rowlow)/2;
        }
    
        //二分法查找列;
        int collow=0,colhigh=col-1,colmid=(colhigh+collow)/2;
        while(collow<=colhigh)
        {
            if (target==matrix[rowindex][colmid])
            {
                return true;
            }
            else if (target<matrix[rowindex][colmid])
            {
                colhigh=colmid-1;
            }
            else
            {
                collow=colmid+1;
            }
            colmid=(colhigh+collow)/2;
        }
        return false;
    }

    参考:

    https://www.cnblogs.com/libaoquan/p/7009981.html

    https://blog.csdn.net/u012850192/article/details/51692094

  • 相关阅读:
    [树莓派]wifi在面板看不到,但是可以scan到的解决方案
    关于GCD的几个结论
    Ubuntu配置vncserver
    树莓派更改vnc分辨率
    玩转树莓派
    两个树莓派(或香蕉派)之间的音频直播测试
    使用树莓派录音——USB声卡
    树莓派自定义命令(给命令起别名)
    gitlab搭建
    linux下的缓存机制及清理buffer/cache/swap的方法梳理 (转)
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/8633875.html
Copyright © 2011-2022 走看看