二维数组——数字查找



题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入一个这样的二维数组和一个整数,判断数组中是否含有该整数。

例如下面的数组:若输入7,则返回true,输入5,则返回false

1 2 8 9

2 4 9 12

4 7 10 13

6 8 11 15

按照一般的想法,从数组中选取一个数字与输入的数进行比较,分三种情况分析,第一种刚好相等,则结束查找,第二种是比输入的数小,则应该在选取的数的右边或者下边继续选取一个数与输入的数再进行比较,第三种比输入的数大,则从选取的数的左边或者上边选取一个数继续与输入的数进行比较。由于要查找的数可能在两个区域中出现,而且还有重叠的区域,所以问题看起来就复杂了。

所以要换另一个中思路。不妨从数组的右上角的数9开始比较。假设输入的数是79>7,根据题意9又是第四列中最小的数,于是第四列数可以全部被排除。这样分析剩下的三列。再次选取右上角的数87进行比较。发现8>7,再次去掉第三列。剩下四行两列数。继续选择右上角的数27比较。发现2<72又是第一行中最大的数,于是可以排除掉第一行中所有的数。剩下三行两列数。继续比较,知道应该去掉第二行数。此时选择剩下的两行两列的右上角的数,发现与7相等,则查找成功,输出true

将整个思路厘清后,再写代码就不是一件很难的事了。大致的代码参考如下:

bool Findint* matrixint rowsint columnsint number

{

bool found=false;

if(matrix!=NULL && rows>0 && columns>0)

{

int row=0;

int column=columns-1;

while(row<rows && column>=0)

{

if(matrix[row*columns+column]==number)

{

found=true;

break;

}

else if(matrix[row*columns+column]>number)

--column;

else

++row;

}

}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值