1. 程式人生 > >【C語言】在楊氏矩陣中查詢一個數字是否存在

【C語言】在楊氏矩陣中查詢一個數字是否存在

題目:有一個二維陣列(楊氏矩陣)陣列的每行從左到右是遞增的,每列從上到下是遞增的。在這樣的陣列中查詢一個數字是否存在。時間複雜度小於O(N)。

此題的解決思路為:由於陣列的每行從左到右是遞增的,每列從上到下是遞增的,因此右上角的這個數為該數所在這一行最大的數,為該數所在這一列最小的數,我們以陣列右上角的這個數為基準進行比較。若我們要查詢的這個數大於右上角的這個數,而右上角的這個數是這一行中最大的數,所以我們可以去掉一行資料,同理,若我們要查詢的這個數小於右上角的這個數,而右上角的這個數是這一列中最小的數,所以我們可以去掉一列資料。

此時我們定義了一個函式為find,如果找到我們要查詢的資料我們帶回下標,並返回1,若沒有找到則返回0。這樣在主函式中用ret接收find的返回值即可。

但是這裡需要注意:我們要帶回所查詢資料的下標,這裡我們要用到返回型引數。我們在傳引數時將x和y的地址傳遞給find函式,find函式用指標px和py接收,並使用內部定義的x和y尋找我們要查詢的資料,若找到了,我們令*px=x,*py=y,這樣就很好的將我們所查詢的元素下標帶出。
 

#include <stdio.h>
#include <stdlib.h>
int find(int arr[3][3], int *px, int *py, int k)
{
	int x = 0;
	int y = *py - 1;
	while (x < *px && y >= 0)
	{
		if (arr[x][y]<k)
			x++;//若某一行的最右側元素小於我們要查詢的值,我們則去掉一行
		else if (arr[x][y]>k)
			y--;//若某一行的最右側元素大於我們要查詢的值,我們則去掉一列
		else
		{
			//返回型引數
			//這裡找到的x和y就是我們的下標
			*px = x;//把x的值賦給*px,*px就是外面的x
			*py = y;//把y的值賦給*py,*py就是外面的y
			return 1;
		}
	}
	return 0;
}
int main()
{
	int arr[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int k = 7;
	int x = 3;
	int y = 3;
	int ret = find(arr, &x, &y, k);
	if (ret == 1)
	{
		printf("找到了:>%d %d\n",x,y);
	}
	else
	{
		printf("沒有找到\n");
	}
	system("pause");
	return 0;
}