題目:在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣一個二維數組和一個整數,判斷數組中是否含有該整數。
例如:
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;
}
其執行結果: