输出”No”代表在二维数组中没有找到数字t。
从右上角开始比较,如果刚好相等,那么直接返回true;
如果要找的数比右上角的大,说明所在的这一行不用比较,那么行数加1 到下一行的右上角比较;
如果要找的数比右上角的小,说明所在的列不用不叫,那么列数减1,到前边伊一列的右上角比较;
因为开始是在九度OJ上做的,所以就是直接按照他的格式来的。
方法一是使用了 动态分配二维数组方式,这方式直接但是分配的数组 只有同一行的在内存中是连续的,但不能保证不同行在内存中连续,例如第二行地址不一定紧接在第一行后面
方法二是使用了 一种折中的方式,利用一维数组来存储二维数组,在函数传参上也不易出错。
当然 很多时候我们也会用数组的方式,只是会define一个MAX作为初始值,但总觉得这种太死板了
#include
#include
#define MAX 10
bool ifIncluded(int **data,int m,int n,int num) //二维数组参数
{
int i=0,j=n-1,temp;
while(i=0)
{
temp= *(*(data+i)+j); //二维数组访问
if(num ==temp )
return true;
if(num > temp)
i++;
else j--;
}
return false;
}
int main(void)
{
int m,n,num;
int **data;
int i,j,count=-1;
bool result[MAX]={false};
while(scanf("%d%d%d",&m,&n,&num)!=EOF)
{
count++;
data=(int**)malloc(sizeof(int*)*m);
for(i=0;i
#include
#include
#define MAX
#define false 0 //这是因为不这么做的话 OJ会提示 false,true undeclared
#define true 1
int ifIncluded(int *data,int m,int n,int num) //使用一维数组存储二维数组
{
int i=0,j=n-1,temp;
if(!data || m <=0 || n<=0) return false;
if(data[0]>num || data[m*n-1]=0)
{
temp=*(data+i*n+j); //使用一维数组存储二维数组时候的数组元素访问
if(temp==num) return true;
if(temp>num) j--;
else i++;
}
return false;
}
int main(void)
{
int m,n,num;
int *data;
int i,j,count=-1;
int result[MAX]={false};
int len=0;
while(scanf("%d%d%d",&m,&n,&num)!=EOF)
{
printf("input matrix\n");
count++;
len=m*n;
data=(int*)malloc(sizeof(int)*m*n);
for(i=0;i
1 positive: 所找元素在矩阵中,等于最小的元素,等于最大的因素,介于最大与最小中间;
2 negative:所找元素不在矩阵中,小于最小元素,大于最大的元素,介于最大与最小中间但是不存在的;
4 invalid:输入的数组为空等。
1 对二维数组的分配方式(静态,动态)的使用,及怎么传入二维数组参数。更加详细可以参见 http://www.cnblogs.com/wuyuegb2312/archive/2013/06/14/3135277.html
2 我自己总是在scanf时候忘了 &!!! 像 &data[i][j]