杨氏矩阵特点:
矩阵从左到右和从上到下严格统一有序(统一递增或递减)
【思维拓展】:杨氏矩阵相当于二叉排序树,左子树都比根节点小,右子树都比根节点大。
以矩阵统一递增为例,二叉排序树转换成矩阵就是左子树在左边,右子树在下面,根节点就是指针当前所指向的数字。
题目:
写出函数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++
扫描二维码关注公众号,回复:
5667590 查看本文章
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;
}