来源:《剑指Offer》
题目:
在一个二维数组中,每一行按照从左到右递增的顺序排列,每一列按照从上到下递增排列。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
分析:
从左下角或者右上角开始比较,每次比较,如果相等,则返回true,如果不等,则可以排除一行或者一列,重复此过程即可。
代码(C++):
#include<iostream>
using namespace std;
#define MAX_ROW 4
#define MAX_COL 4
void initData(int data[][MAX_COL],int total);
bool search(int data[][MAX_COL],int value);
int main()
{
int data[MAX_ROW][MAX_COL];// 声明一个二维数组
// int data[MAX_ROW][MAX_COL]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
int value;
int total;
total=MAX_ROW * MAX_COL;
// 输入数组
cout<<"请输入"<<total<<"个整数作为数组元素"<<endl;
initData(data,total);
cout<<"请输入要查找的数\n";
cin>>value;
cout<<(search(NULL,value)?"true":"false")<<endl;
return 0;
}
// 从控制台输入数组
void initData(int data[][MAX_COL],int total)
{
int num;
num=0;
for(int i=0,j=0;num<total;i++,j++)
{
cin>>data[i%MAX_ROW][j%MAX_COL];
num++;
}
}
bool search(int data[][MAX_COL],int value)
{
int i,j;
if(data==NULL)
return false;
i=0;
j=MAX_COL-1;
while(true)
{
if(i>=MAX_ROW||i<0||j>=MAX_COL||j<0)
return false;
if(data[i][j]==value)
{
return true;
}
if(data[i][j]<value)
{
// 去掉一行
i++;
continue;
}
if(data[i][j]>value)
{
// 去掉一列
j--;
continue;
}
}
}