杨氏矩阵(C语言)

文章介绍了如何在一个每行和每列都递增的矩阵中,使用高效的算法查找特定数字,确保时间复杂度小于O(N),并通过示例代码展示了查找过程。
摘要由CSDN通过智能技术生成

文章目录

问题

有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。

要求:时间复杂度小于O(N);

技术名词解释

杨氏矩阵: 矩阵的每行从左到右是递增的,每列从上到下是递增的。是对组合表示理论和舒伯特演算很有用的工具。它提供了一种方便的方式来描述对称和一般线性群的群表示,并研究它们的性质。杨氏矩阵是剑桥大学大学数学家阿尔弗雷德·扬在1900年提出。然后在1903年,它被用于格奥尔格·弗罗贝纽斯的对称群研究中。它的理论得益于许多数学家的贡献得到进一步发展,包括珀西·麦克马洪,W.V.D.霍奇,G.deB.罗宾逊,吉安·卡咯罗塔,阿兰拉斯克斯,马塞尔·保罗斯库森博格和理查德·P·史丹利。


思路

定义一个二维数组arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}。


关键代码

1、如果第一次输入不相等,则通过while循环找到所在下标,条件肯定包括a!=arr[i][col-1]、i<row和col>=0。

    int a = 0;
    printf("请输入你想找的数:");
    scanf("%d", &a);
    int i = 0, count = 1;
    while (a != arr[i][col - 1] && i < row && col >= 0)
    {
        if (a < arr[i][col - 1])
        {
            col--;
            count++;
        }
        else
        {
            count++;
            i++;
        }
    }


2、第一次相等或者通过while循环之后通过if实现下标、比较次数和是否找到的打印。

    if (a == arr[i][col - 1])
    {
        printf("下标为(%d,%d)\n", i, col - 1);
        printf("比较了%d次\n", count);
        return 1;
    }
    else
    {
        printf("比较了%d次\n", count);
        return 0;
    }

运行代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>

int Young_tableau(int arr[4][4], int row, int col)
{
	printf("****************\n");
	Sleep(100);
	printf("****寻找开始****\n");
	Sleep(100);
	printf("****************\n");
	Sleep(100);

	int a = 0;
	printf("请输入你想找的数:");
	scanf("%d", &a);
	int i = 0, count = 1;
	while (a != arr[i][col - 1] && i < row && col >= 0)
	{
		if (a < arr[i][col - 1])
		{
			col--;
			count++;
		}
		else
		{
			count++;
			i++;
		}
	}
	if (a == arr[i][col - 1])
	{
		printf("下标为(%d,%d)\n", i, col - 1);
		printf("比较了%d次\n", count);
		return 1;
	}
	else
	{
		printf("比较了%d次\n", count);
		return 0;
	}
}
int main()
{
	int arr[4][4] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 };
	int row = 4, col = 4;
	int ret=Young_tableau(arr, row, col);
	if (ret == 1)
	{
		printf("找到了\n");
	}
	else
	{
		printf("找不到了\n");
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值