题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有该整数。
例如:
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
如果查找数字7,则返回true,如果查找数字5,则返回false.
对于这道题主要考察二维数组的存储,二维数组在内存中是一维存储,从上到下存储各行元素,在同一行中按照左向右的顺序存储。因此可以根据行号和列号计算出数组首地址的偏移量,从而可以找到对应的元素。
该题的大致思路就是从最后一列向前进行比较,找到比key小的之后从行的上面向下遍历。。。
下面给出具体的代码:
#include<iostream>
#include<stdlib.h>
using namespace std;
#define N 4
bool Iskey_exist(int *a,int rows,int cols,int key)
{
bool found = false;
if(a != NULL && rows > 0 && cols > 0){
int row = 0;
int col = cols - 1;
while(row < rows && col >= 0){
if(a[row * cols + col] == key){
found = true;
break;
}else if(a[row * cols + col] > key){
--col;
}else{
++row;
}
}
}
return found;
}
int main(int argc,char**argv)
{
int a[N][N];
int key;
cout << "please input elements:"<<endl;
for(int i = 0;i < N; ++i){
for(int j = 0;j < N ;++j){
cin >> a[i][j];
}
}
while(1){
cout << "please input key:(-1 == quit) "<<endl;
cin >> key;
if(key == -1){
cout << "error!!" << endl;
exit(1);
}
if(Iskey_exist((int *)a,N,N,key)){
cout << key << " is found!!"<< endl;
}else{
cout << key << " is not found !!"<<endl;
}
}
return 0;
}
其执行结果: