在杨氏矩阵(一个二维数组,从左向右递增,从上往下递增)中查找一个数是否存在

首先我们要搞清楚杨氏矩阵是什么。
简单来说杨氏矩阵就是一个二维数组,在这个二维数组中,每一行从左向右是递增的,每一列从上往下是递增的。
简单认识杨氏矩阵之后,接下来我们该怎样去思考这个问题?或者说我们该如何下手呢?
假设我们有一个这样的二维数组:
1 3 5
3 5 7
5 7 9
如果说我们要在这样的一个数组中去寻找7,那我们该怎样去找?不妨现试试从中心出发,将中心这个数也就是5与我们要寻找的7相比,5<7,那么接下来该用哪个数去和要寻找的数比较呢?换言之就是下一步该怎样做,我们知道在这个数组中从左到右是递增的,从上往下也是递增的,也就说,比较完5<7之后,我们可以从5的右边去找,或从5的下面去找,这也就造成了第二步的不确定性,可能在这个简单的数组中,无论下一步比较哪里都可以,但如果将这个矩阵扩大呢?显然从中心出发不合适?
从左上角或是右下角出发也是行不通的,道理同上(在左上角的数的右边和下边都是比它自己大的数。在右下角的左边和上边都是小于它自己的数)。
这样思考之后,我们不难发现,我们可以从右上角的数或是左下角的数去出发寻找(只要我们要寻找的数大于右上角的数字,就在下面找,也就是行数row + 1,相反就是列数 col - 1.从左下角出发亦是如此)
基于以上思路,我们将其转换为编程实现

#include <stdio.h>
#include <stdlib.h>
int FindNum(int a[][3], int row, int col, int f){
	int i = 0;
	int j = col - 1;
	while (i < row && j >= 0){
		if (a[i][j] < f){
			++i;
		}
		else if (a[i][j] > f){
			--j;
		}
		else {
			return 1;
		}
	}
	return 0;
}
int main(){
	int a[][3] = {{ 1, 3, 5 }, { 3, 5, 7 }, { 5, 7, 9 }};
	if (FindNum(a,3,3,10)){
		printf("找到了!\n");
	}
	else {
		printf("没找到!\n");
	}
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44781107/article/details/89453520
今日推荐