1. 程式人生 > >//楊氏矩陣 有一個二維陣列. 陣列的每行從左到右是遞增的,每列從上到下是遞增的. 在這樣的陣列中查詢一個數字是否存在。

//楊氏矩陣 有一個二維陣列. 陣列的每行從左到右是遞增的,每列從上到下是遞增的. 在這樣的陣列中查詢一個數字是否存在。

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

我用一個while迴圈實現了該要求

#include <stdio.h>
#include <windows.h>
/*
	//楊氏矩陣
	有一個二維陣列.
	陣列的每行從左到右是遞增的,每列從上到下是遞增的.
	在這樣的陣列中查詢一個數字是否存在。
	時間複雜度小於O(N);
*/
#define ROW 4
#define COL 4
//寫一個迴圈函式即可
int Search(int arr[ROW][COL], int value) {
	int i = 0;
	int j = COL - 1;
	int tmp = arr[i][j];
	while (1) {
		if (value == tmp) {
			return 1;
		} else if (value > tmp && i < ROW - 1) {
			tmp = arr[++i][j];
		} else if (value < tmp && j > 0) {
			tmp = arr[i][--j];
		} else {
			return 0;
		}
	}
}

int main() {
	int arr[ROW][COL] = {
		{1, 2, 3, 4},
		{2, 3, 6, 9},
		{3, 4, 7, 12}
	};
	int num = 0;
	printf("請輸入你要查詢的數字\n");
	scanf("%d", &num);
	if (Search(arr, num) == 1) {
		printf("查詢成功!!!\n");
	} else {
		printf("查詢失敗!!!\n");
	}

	return 0;
}

根據題目要求, 選擇查詢的起始位置是件很關鍵的事, 將起始查詢位置設定在第一行的最後一列元素, 為什麼要設定在這裡, 因為這個位置的元素是該行最大的元素同時也是該列的最小元素, 即所謂的"鞍點", 此時, 我們可以根據查詢值與指定位置元素的大小比較來連續改變行或列進行依次比較, 最終找到目標或沒找到目標.