【C语言】—— 杨氏矩阵的查找问题

题目:

      有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的请编写程序在这样的矩阵中套找某个数字是否存在。
要求:时间复杂度小于O(N);

一、杨氏矩阵是什么?

        在一个二维数组中(行和列的值都相等),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。

注意:每一行从左到右递增,每一列从上往下递增。递增指的是逐渐增大,切不可片面理解为等差递增。

二、杨氏矩阵求解的思路

  我们以下面这个矩阵为例,查找元素k=7;

       首先我们来理解一下题目,题目说明了时间复杂度要小于O(N),所以我们就不能使用遍历法来求解。

下面来说明一下我们的解题思路:

        我们通过观察这个数组,可以发现,数组的每一行的最右边的数字是最大的,每一列的最下面的元素最大。因此,我们可以通过这一发现来求解杨氏矩阵。

方法:

        第一步:首先我们可以先取数组中的右上角的元素(或左下角的元素,这里用右上角的为例) 

        第二步:让该元素和要查找的值相比较,7大于3,所以可以删掉最上面的一行。(如果查找值k<3,则删掉最右的一列)

       (k>3时)                                                           (k<3时)

                                       

        第三步:依次类推,我们就可以查找数组中是否有要查找的值。

                  

三、杨氏矩阵的代码实现

//题目11:杨氏矩阵
//矩阵的每行从左到右是递增的,矩阵从上到下是递增的请编写程序在这样的矩阵中套找某个数字是否存在。
//要求:时间复杂度小于O(N);

int test(int arr[3][3], int k, int* px, int* py)
{
	int row = 0;			//row表示行
	int col = *py - 1;		//col表示列
	while (row <= *px-1 && col >= 0)	
	{
		if (arr[row][col] < k)
			row++;
		else if (arr[row][col] > k)
			col--;
		else
		{
			*px = row;	
			*py = col;
			return 1;
		}
	}
	return 0;
}
int main()
{
	int arr[3][3] = { {1,2,3 } ,{4,5,6} ,{7,8,9} };
	int k = 7;
	int x = 3;
	int y = 3;

	int ret=test(arr, k, &x, &y);	//通过传地址的值来确定下标,并将下标传回来
	if (ret == 1)
	{
		printf("找到了\n");
		printf("下标为%d %d\n", x, y);
	}
	else
		printf("找不到\n");

	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值