数组之杨氏矩阵

参考资料:http://blog.csdn.net/sgbfblog/article/details/7745450 

题目:

     杨氏矩阵----------矩阵每一行元素从左到右依次递增;每一列从上到下依次递增

     问题:判断任意一个元素是否在该矩阵中

例如如下的杨氏矩阵:

134218~1

解法一:

      step_wise线性搜索算法----------从右上角开始,每次将待搜索值与右上角元素进行比较,若待搜索元素大于右上角值,则去除一行,否则去除一列。

比如待搜索元素为13,右上角元素为15,那么右上角元素所在列删除(因为,列逐渐递增),同理11小于13因此删除一行…最终查找的路线为下图中红色

路线,最差的情况下,查找从右上角直到左下角对于M*N矩阵,时间复杂度为O(M+N)

134218~1

/*
 *
 */

#include<iostream>
using namespace std;

bool find(int (*array)[3],int m,int n,int value)
{
    bool findout=false;
    int row=0;
    int col=n-1;

    while(!findout && row <m && col>=0)
    {
        if(array[row][col]==value)
        {
            findout=true;
            cout<<"row:"<<row<<",col:"<<col<<endl;
        }
        else if(array[row][col]>value)
        {
            col--;
        }
        else
        {
            row++;
        }
    }
    return findout;
}

int main()
{
    int array[3][3]={
        {1,3,8},
        {2,4,9},
        {3,5,17}
    };
    int m=3;
    int n=3;
    int value=12;
    bool result=find(array,m,n,value);
    if(result)
    {
        cout<<"TURE"<<endl;
    }
    else
    {
        cout<<"FLASE"<<endl;
    }
}

解法二:

   二分算法------从矩阵的中间行或者中间列或者对角线开始查找,找到满足:

 ai < s < ai+1 ,  其中ai为矩阵中的值。将矩阵分成两个子矩阵,然后继续进行划分
 
   (1)从中间行开始查找
    134225~1
 
 
    (2)从中间列开始查找
    134225~2[1]
 
 
    (3)从对角线开始查找
    134225~3[1]
原文地址:https://www.cnblogs.com/luosongchao/p/3679456.html