題目:在一個二維數組中,每一行按照從左到右遞增的順序排序,每一列按照從上到下的順序排序,輸入二維數組和整數,判斷是否存在。
例如下方的二維數組:
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;
}