【練習題】楊氏矩陣查找

楊氏矩陣特點:

矩陣從左到右和從上到下嚴格統一有序(統一遞增或遞減)

【思維拓展】:楊氏矩陣相當於二叉排序樹,左子樹都比根節點小,右子樹都比根節點大。

以矩陣統一遞增爲例,二叉排序樹轉換成矩陣就是左子樹在左邊,右子樹在下面,根節點就是指針當前所指向的數字。

題目:

寫出函數find_target,判斷一個數字target是否在一個n * m的二維矩陣中

矩陣性質如下:

  • 矩陣的每一行都是從左向右升序排列
  • 矩陣每行的第一個數字要比上一行的而最後一個數字大

如果這個數字在矩陣中,返回1,否則返回0

int find_target(int ** matrix, int n, int m, int target) {
	
}

思路1:兩次二分,第一次確定在第幾行,第二次確定第幾列

int find_target(int ** matrix, int n, int m, int target) {
	int l = 0, r = n * m - 1, mid;
    while (l <= r) {
		mid = l + (r - l) / 2;
        if (*(*(matrix + mid / m) + mid % m) == target) return 1;
        else if (*(*(matrix + mid / m) + mid % m) > target) r = mid - 1;
        else l = mid + 1;
    }
    return 0;
}

思路2:楊氏矩陣查找求解

​ 從右上角開始(因爲右上角的值符合左邊比他小,下面比她大的原則)。

​ 若target<右上角值,指針向左移(因爲左邊的數比當前值小),j--

​ 若target > 右上角值,指針向下移(因爲下面的數都比當前值大),i++

int find_target(int ** matrix, int n, int m, int target) {
	//n行m列
    int i = 0, j = m - 1;
    //若在合法範圍內,進行循環
    while ((i > -1 && i < n) && (j > -1 && j < m)) {
    	if (target == matrix[i][j]) return 1;
        else if (target < matrix[i][j]) --j;
        else ++i;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章