题目:在一个二维数组中,每一行按照从左到右递增的顺序排序,每一列按照从上到下的顺序排序,输入二维数组和整数,判断是否存在。
例如下方的二维数组:
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
思路:当我们看到这道题的第一反应应该是遍历这个二维数组,逐个进行查找,这样虽然可以得到结果但是时间复杂度较大,并且没有用到题目中给我们的线索,我们可以看到该二维数字是按照一定顺序排列的。我们可以把这个四行四列的二维数组看做一个4*4的方格,先找出右上角的数字,如果右上角的数字是我们要找的数字就结束,如果比要找的数字小那就排除这一列(因为右上角的数字是这一列最小的),同理,如果比要找的数字大,那么我们就排除这一行。这样一来我们会把查找的区域逐渐缩小。到最后没有找到就说明没有,反之则找到。
#include<stdio.h>
#include<assert.h>
bool sort(int arr[4][4],int key)
{
assert(arr!=NULL);
int i,j;
i=0;
j=3;//通过下标定位到右上角
while(i<3&&j>0)
{
if(arr[i][j]==key)//找到则返回
{
return true;
}
if(arr[i][j]>key)如果比目标数字大则剔除这一列
{
j--;
}
else//比目标数字小则剔除这一行
{
i++;
}
}
return false;
}
int main()
{
int arr[4][4]={1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15};
int n=sort(arr,7);
if(n==1)
{
printf("存在该元素\n");
}
else
{
printf("该元素不存在\n");
}
return 0;
}