劍指offer面試題:二維數組的查找

      題目:在一個二維數組中,每一行按照從左到右遞增的順序排序,每一列按照從上到下的順序排序,輸入二維數組和整數,判斷是否存在。

例如下方的二維數組:
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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章