• 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

  • 相关阅读:
    IOS中图片拉伸技巧与方法总结
    iOS xcode8提交 iOS10 “此构建版本无效”
    ios 通过代码调节屏幕亮度
    修改UIBarButtonItem字体大小、颜色等相关属性
    iOS tableView编辑添加多个按钮
    iOS开发 适配iOS10
    iOS开发系列--并行开发其实很容易
    CATransform3D 特效详解
    iOS 图片切圆角的另外两种方式
    获取UILabel宽度的方法
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/8633875.html
Copyright © 2020-2023  润新知