题目:在一个二维数组中,每一行都按照从左到右,从上到下的顺序递增。请完成一个函数,输入这样的一个数组和一个整数,判断数组中是否含有该整数。
假设数组为:
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
刚开始的想法是从主对角线元素开始比较,若该正整数小于一个元素,则会排出一部分。排出的部分为剩余对角线元素所组成矩阵。
后来又想到比较边界元素即最后一行的元素和最后一列的第一个元素,a[length-1][0]和a[0][lenght-1],若该正整数小于a[length-1][0]则可以排出最后一行的所有元素,若大于则可以排出这一列,同样和a[0][length-1]比较的结果也是一样。重复上面的步奏直到找到该正整数或者未找到。
这样的边界元素有这样的特点:在所处行(列)中是最大的一个数,但是在所处的列(行)中却是最小的,也就是要么这个数是要找的数,要么肯定会排除一行或者一列。
选取左下角的元素则:column和row分别代表开始时的初始列号和行号,初始时column=0,row=max开始。
if(number>a[lmax][0])
{
column++;
}
else
{
row--;
}
若number大于a[]max[0]则说明第一列中没有该数字排除,第二比较的二维数组列的起始为colmun+1,反之则排除最后一行第二次比较的数组的列数为row-1。
初始化时:column=0,row=max-1;
bool find(int column,int row)
{
while(colum<=max-1&&row>=0){
if(number==a[column][row])
{
return true;
break;
}
else if(number>a[row][column])
{
column++;
}
else
{
row--;
}
}
}