【练习题】杨氏矩阵查找

杨氏矩阵特点:

矩阵从左到右和从上到下严格统一有序(统一递增或递减)

【思维拓展】:杨氏矩阵相当于二叉排序树,左子树都比根节点小,右子树都比根节点大。

以矩阵统一递增为例,二叉排序树转换成矩阵就是左子树在左边,右子树在下面,根节点就是指针当前所指向的数字。

题目:

写出函数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;
}

猜你喜欢

转载自blog.csdn.net/tarawin/article/details/88821638