首页 > 其他分享 >杨氏矩阵和杨辉三角的空间复杂度较小的解题思路

杨氏矩阵和杨辉三角的空间复杂度较小的解题思路

时间:2024-06-12 20:04:46浏览次数:26  
标签:arr int 复杂度 矩阵 查找 解题 第二行 杨辉三角


文章目录


题目1 杨氏矩阵

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

思路:
我们可以通过题目要求分析得到:矩阵最右上角的数是一行中最大的数,是一列中最小的数
我们可以将这个数和需要查找的数进行比较:
如果这个数比查找的数大,说明查找的数肯定不在这一列,往左查找。
如果这个数比查找的数小,说明该行肯定没有这个数,往下查找。

举例分析:
矩阵
1 2 3
4 5 6
7 8 9
如果我们要查找5
(1)先和最右上角的3进行对比,5比3大,3又是第0行最大的数,所以该行肯定没有5,往下查找。
查找的范围为:
4 5 6
7 8 9

(2)此时最右上角的数为6,6比5大,6这一列的数肯定都比6大,所以这一列肯定没有5,往左查找。
查找的范围为:
4 5
7 8

(3)此时最右上角的数为5,成功找到该数并打印出所在矩阵的位置。
其他情况依次类推。

代码如下:


#include <stdio.h>
#define N 3
int main()
{
	int arr[N][N] = { {1,2,3},{4,5,6},{7,8,9} };
	int num;
	int flag;
	while (scanf("%d", &num) != EOF)
	{
		int i = 0;
		int j = N - 1;			//开始的i和j定位到矩阵最右上角的数
		flag = 0;				//假设最开始找不到该数
		while(i < N && j >= 0)
		{
			if (arr[i][j] > num)//如果最右上脚的数比查找的数大,则可以不用再查找这一列
			{
				j--;
			}
			else if (arr[i][j] < num)
			{
				i++;
			}
			else
			{
				flag = 1;
				break;
			}
		}
		if (flag == 1)
		{
			printf("成功查找到该数,该数处于第 %d 行,第 %d 列\n", i + 1, j + 1);
		}
		else
		{
			printf("该矩阵中找不到该数\n");
		}
	}
	return 0;
}

结果如图:
在这里插入图片描述

题目2 杨辉三角

在屏幕上打印杨辉三角:
1
1 1
1 2 1
1 3 3 1
……

思路:
首先我们观察杨辉三角的例子,可以找到规律:假设这是一个正方形,空白的地方对应的数是0,除去第一列的数都是1,每一行后面的每个数都是由上面一行该位置的数加上其前面的一个数之和。

我们可以发现,从第二行开始,每一行只和上面一行有联系,所以我们可以填一行的数组就打印一行,不用二维数组来解决,降低空间复杂度。

我们可以用一维数组的方式来实现,除去第一列,每一行后面的数的值等于当前位置的数加上前面一个位置的数之和。

因为我们每次将两个数相加时,要保证这两个数的值都没有被修改过
如果我们从左往右赋值,后面的数在进行相加的时候前面的数已经被修改了,会导致后面的数都是一样的,所以,我们需要从右往左依次计算结果

举例分析:
假如我们想要输出杨辉三角前三行。
我们可以把杨辉三角看成
1 0 0
1 1 0
1 2 1
(0只是方便我们思考与计算,最终不用打印出来)
(1)首先每一列第一个数都是1,第一行直接打印1就行。
(2)此时数组的值分别为1 0 0,开始打印第二行,把第一行的数转换成第二行的数,可以发现第二行跟第一行的区别就是第二行第二个数是1,在第一行的基础上,我们可以将第二个数0和前面的1相加(标重的字体),将结果得到的1替换掉当前位置的0,然后直接输出,继续下一行的打印。
(3)此时数组的值分别为1 1 0,第三行后面两个数都和第二行不同,如果用刚才的思路,从左往右计算,那么,第三个数的计算就会变成0+2替换掉0,数组为1 2 2,显然不满足题目要求,第二个数先被修改了导致第三个数错误,所以,为了满足前面的数不被修改,我们需要从右往左计算。
(4)数组为1 1 0,首先计算第三个数,0+1=1,替换掉0,得到数组1 1 1,然后计算第二个数,1+1=2,替换掉当前位置的1,得到数组1 2 1,将第二行转换成第三行,之后输出结果。

代码如下:

#include <stdio.h>
#define N 10
int main()
{
	int arr[N] = { 1 };
	printf("1\n");						//第一行只有一个1,直接打印
	int i = 0;
	for (i = 1; i < N; i++)				//从第二行开始赋值
	{
		int j = 0;
		for (j = i; j > 0; j--)
		{
			arr[j] += arr[j - 1];		//从右往左依次计算
		}
		for (j = 0; j <= i; j++)
		{
			printf("%d ", arr[j]);
		}
		printf("\n");
	}
	return 0;
}

标签:arr,int,复杂度,矩阵,查找,解题,第二行,杨辉三角
From: https://blog.csdn.net/2303_77043191/article/details/139634174

相关文章

  • 「笔记」递归算法复杂度分析
    目录写在前面递归算法形式递归树大力求和主定理MasterTheorem典题1234写在最后写在前面可恶的算法分析与设计!!!递归算法形式对于一个输入规模为\(n\)的递归算法,每次均为将整个问题划分为\(a\)个规模为\(\frac{n}{b}\)的子问题,回溯时将所有子问题合并需要\(f(n)\)的时......
  • P3756 [CQOI2017] 老C的方块 解题报告
    oj:https://gxyzoj.com/d/gxyznoi/p/P266又是网格题,考虑染色:显然可以发现,每一个不合法的图形都可以被染成黄->蓝->特殊边->绿->红,且旋转后同样满足条件推广到整个棋盘就是:所以是否可以将颜色编号,然后按照上述方法连边呢?显然是可以的,若一个格子被填上了方块,则讨厌的形状一定......
  • 2559. 统计范围内的元音字符串数(前缀和) o(n)时间复杂度
    给你一个下标从 0 开始的字符串数组 words 以及一个二维整数数组 queries 。每个查询 queries[i]=[li,ri] 会要求我们统计在 words 中下标在 li 到 ri 范围内(包含 这两个值)并且以元音开头和结尾的字符串的数目。返回一个整数数组,其中数组的第 i 个元素对......
  • 算法的时间复杂度和空间复杂度
    目录1.算法效率1.1如何衡量一个算法的好坏1.2算法的复杂度1.3复杂度在校招中的考察2.时间复杂度2.1时间复杂度的概念2.2大O的渐进表示法2.3常见时间复杂度计算举例实例1:实例2:实例3:实例4:实例5:实例6:实例7:实例8:3.空间复杂度实例1:实例2:实例3:4.常见复杂度对比1.......
  • Java—集合框架、时间和空间复杂度
    一、集合框架Java集合框架(JavaCollectionFramework),又称为容器(container),是定义在java.util包下的一组接口(interfaces)和其实现类(classes)其主要表现为将多个元素(element)置于一个单元中,用于对这些元素进行快速、便捷的存储(store)、检索(retrieve)、管理(manipulate......
  • P4003 [清华集训 2017] 无限之环 解题报告
    oj:https://gxyzoj.com/d/gxyznoi/p/P93它要判断什么时候不漏水,就是需要建一种图,使得原图的最大流是答案因为是网格图,考虑黑白染色,可以将\((i+j)\)对2取模的结果作为颜色,将所有颜色为1的点向源点连边,颜色为0的点向汇点连边接下来考虑如何判断是否漏水,因为有四个方向,考虑拆点将......
  • 线段树合并复杂度证明
    以CF600E为例,没看过题目的先去看题。本题的线段树做法,即对题目所给树中每个结点所在子树建树维护数字出现情况。此做法中,当前节点和其兄弟节点对应的线段树需要合并到父节点上,最后父节点上权值update到新树。也就是说对于每个非叶子节点,其有x个子节点,就要合并x次(其实也可以看成x-......
  • 杨辉三角C语言的超简单解决办法
    #include<stdio.h>#include<stdlib.h>intmain(){intarr[10][10]={0};//十行的杨辉三角intsize=sizeof(arr)/sizeof(arr[0]);//求一共有几行for(inti=0;i<size;i++){for(intj=0;j<=i;j++)//对角线{if(i==j||j=......
  • 记录自己在upload-labs的解题过程
    第十二关(get%00截断)打开第十二关,查看源代码发现进行了白名单过滤,只允许上传jpg、png、gif的图片格式,move_uploaded_file本函数检查并确保由 file 指定的文件是合法的上传文件(即通过PHP的HTTPPOST上传机制所上传的)。如果文件合法,则将其移动为由 newloc 指定的文件......
  • CF720B 解题报告
    题目大意给定一个仙人掌,每条边有颜色,求将原仙人掌断边成树后边权最多有多少不同的。解题报告仙人掌有性质为:一条边不会在多个环内。意味着各个环的操作是独立的。考虑统计所有环上的颜色和数量,此部分易实现。最大化颜色种类数,等价于最小化所失去的颜色数量。易转化成强制无法......