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

posted @ 2018-03-23 20:05  eeeeeeee鹅  阅读(182)  评论(0编辑  收藏  举报