杨氏矩阵思路详解(C语言)

什么是杨氏矩阵
杨氏矩阵是从左到右,从上到下数字递增的一个矩阵
例如:
1 2 3
4 5 6
7 8 9
但不是说,第一行比第二行的数字要大,第三行数字要比第二行数字要大,例如下面的情况
例如:
1 2 3
2 4 5
4 5 6

思路
在杨氏矩阵中,查找某个数字,我们一般可以对比查找,那开始对比的数字怎么寻找呢?
首先可以找右上角或者左下角这两种情况,具体举例用右上角。
为什么找的是这两个数字?
原因:
1 2 3
2 4 5
4 5 6
看这个矩阵,右上角的3是一行中最大的,一列中最小的,和它进行对比。
要找的数字比它大,向下继续寻找(y不变,x- -)
要找的数字比它小,向左继续寻找(x不变,y- -)

为什么不是左上角,右下角的数字呢?
因为左上角的数字比要找的任何数字都要小,除了它本身以外,再去找一个其他的数字与左上角的数字对比,没有什么意义,反而会浪费电脑操作的时间,右下角同理。

实现函数

int Findnum(int arr[3][3], int k, int row, int col)
{
    
    
	int x = 0;
	int y = col - 1;//找右上角进行对比

	while (x <= row - 1 && y >= 0)//找右上角对比,最后对比的情况一直向左下角收缩,
		                       //假设找的是7的话,3*3的矩阵就会收缩到第三行第一列,因为这是极端的情况
	{
    
    
		if (arr[x][y] > k)//说明右上角的数比想要找的数字大,应该继续向左找
		{
    
    
			y--;
		}
		else if (arr[x][y] < k)//右上角的数字比要找的数字小,继续向下找
		{
    
    
			x++;
		}
		else
		{
    
    
			return 1;
		}
	}
    //循环完之后找不到,直接返回0
	return 0;
}

完整流程

#include <stdio.h>
int Findnum(int arr[3][3], int k, int row, int col)
{
    
    
	int x = 0;
	int y = col - 1;//找右上角进行对比

	while (x <= row - 1 && y >= 0)//找右上角对比,最后对比的情况一直向左下角收缩,
		                       //假设找的是7的话,3*3的矩阵就会收缩到第三行第一列,因为这是极端的情况
	{
    
    
		if (arr[x][y] > k)//说明右上角的数比想要找的数字大,应该继续向左找
		{
    
    
			y--;
		}
		else if (arr[x][y] < k)//右上角的数字比要找的数字小,继续向下找
		{
    
    
			x++;
		}
		else
		{
    
    
			return 1;
		}
	}
    //循环完之后找不到,直接返回0
	return 0;
}

int main()
{
    
    
	int arr[3][3] = {
    
     {
    
    1,2,3}, {
    
    4,5,6}, {
    
    7,8,9} };
	int k = 7;
	int ret = Findnum(arr, k, 3, 3);
	if (ret == 1)
	{
    
    
		printf("找到了\n");
	}
	else
	{
    
    
		printf("没找到\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/aaaaauaan/article/details/105610393