读书笔记-剑指offer 面试题3

来源:互联网 发布:数据采集处理 dsp fpga 编辑:程序博客网 时间:2024/05/16 11:41

题目描述:在一个二维数组中,每行从左到右都是升序排列,每列从上到下也是升序排列,从一个二维数组中查找一个数是否存在

 

一般方法:遍历,这样最坏情况也要o(n)的时间

 

优化方法:假如要查找的数为a

由于每行和每列都是升序的,那么我们先从右上角开始找,

1,如果a等于右上角的这个数,则查找成功;

2,如果小于,则列数减一,或者把当前列删去,然后继续1

3,如果大于,则行数加一,或者把当前行删去,然后继续1

4,如果剩余行数为数组的行数,列数为0,则不存在

这样最坏的查找次数也就是(行数+列数);

实现代码:

bool find(int **p,int row,int col,int key){    bool flag=false;    if(NULL!=p&&row>0&&col>0){int i=0,j=col-1;while(i<row&&j>=0){        if(p[i][j]==key){flag=true;break;    }    else if(p[i][j]<key)--j;    else ++i;}    }    return flag;}


 

原创粉丝点击