Description
给定整型数组B[0..m,0..n] 。已知B中数据在每一维方向上都按从小到大的次序排列,且整型变量x在B中存在。试设计一个程序段找出一对满足B[i,j]=x的(i,j)值,要求比较次数不超过m+n.
Input
数组长,宽
数组各元素的值
变量x
Output
输出所有的i,j对
Sample Input
5 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
1
Sample Output
1 1
HINT
X在B中也许并不只一个,多组数据按行优先策略
代码如下:
#include <iostream>
using namespace std;
int main()
{
int m,n,i,j,a[20][20],num;
while (cin>>m>>n)
{
for (i=0; i<m; ++i)
for (j=0; j<n; ++j)
cin>>a[i][j];
cin>>num;
i=0,j=n-1;
while (i<m&&j>=0)
{
if (a[i][j]==num)
{
cout<<i+1<<" "<<j+1<<endl;
i++;
}
else if (a[i][j]>num)
j--;
else
i++;
}
}
return 0;
}
运行结果:
学习心得:
很久没有静心做题了,,,中午看到这道题,来了兴趣。
题目要求时间复杂度不能超过m+n,所以一般的二重循环是肯定不行的,但题目中说输入的数据每一维(x,y方向上都是)是按照从小到大的顺序排列的,所以我们可以从右上角按照当前位置与输要查找的那个数的情况分别向左、向下找询。如结果所示。