题目:在一个二维数组中,每一行按照从左到右递增的顺序排序,每一列按照从上到下的顺序排序,输入二维数组和整数,判断是否存在。
例如下方的二维数组:
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;
}