题目描述:在一个二维数组中,每一行元素从左到右递增,从上到下递增,现输入一个整数,判断数组中是否存在该整数,要求时间复杂度为O(n)
思路:可以数组分为三个部分,数组右上角,左边,下面
例如:数组如下
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
查找元需为7,数组右上角元素为9
因为7<9,则在9左边的三列中寻找7元素,将col减1
1 2 8
2 4 9
4 7 10
6 8 11
再取数组右上角元素8,7<8,则在8左边的两列中寻找7元素,将col减1
1 2
2 4
4 7
6 8
再取数组右上角元素2,7>2,则在2下边三行中寻找元素7,注意此时的3行,值
2 4
4 7
6 8,前面已经将col至2啦
再取数组的右上角元素4,7>4,则在4下边2行中寻找
4 7
6 8
再取数组的右上角元素7,7==4,返回,查找成功
具体实现代码如下:
//array(实质为二维数组)数组的特征:从左到右递增,从上到下递减
//思路:先将num与右上角的元素相比较,相等则直接返回,表示找到
//小于,则在左边的列寻找,将列数减一
//大于,则在下放元素寻找,将行数增一
bool find_num(int *array, int *index, int rows, int cols, int num)
{
bool flag=false;
//int temp = array[col-1];
if(array!=NULL && cols>0 && rows>0) //判断参数的有效性
{
int row=0, col=cols-1; //与右上角的数字比较
while(array!=NULL && row<rows && col>0)
{
if(num==array[row*cols+col])
{
flag=true;
index[0] = row;
index[1] = col;
break;
}
else if(array[row*cols+col]>num)
--col;
else
++row;
}
}
return flag;
}
int main(void)
{
int index[2] = {0};
int array[]={1, 2, 8, 9, 2, 4, 9, 12, 4, 7, 10, 13, 6, 8, 11, 15};
bool ret = find_num(array, index, 4, 4, 7);
cout << ret << " " << index[0] << " " << index[1] << endl;
return 0;
}