楊氏矩陣特點:
矩陣從左到右和從上到下嚴格統一有序(統一遞增或遞減)
【思維拓展】:楊氏矩陣相當於二叉排序樹,左子樹都比根節點小,右子樹都比根節點大。
以矩陣統一遞增爲例,二叉排序樹轉換成矩陣就是左子樹在左邊,右子樹在下面,根節點就是指針當前所指向的數字。
題目:
寫出函數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;
}