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

news2024/11/9 2:05:16

文章目录

  • 题目1 杨氏矩阵
  • 题目2 杨辉三角


题目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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1819049.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot SSM 宠物医院管理系统(源码+论文)

绪论 1.1 计算机管理信息系统的发展情况 1958 年美国首先提出了 “管理信息系统 ”&#xff08;即 MIS&#xff1a;Management Information Systems&#xff09;&#xff0c;从而也引出了另外一个概念 ——“管理信息系统 ”。综合其多种定义以及根据在实际中的应用&#xff…

C语言| 数组

直接定义一个数组&#xff0c;并给所有元素赋值。 数组的下标从0开始&#xff0c;下标又表示数组的长度。 【程序代码】 #include <stdio.h> int main(void) { int a[5] {1, 2, 3, 4, 5}; int i; for(i0; i<5; i) { printf("a[%d] %d\…

HSP_08章 断点调试

P100 断点调试 1. 基本介绍 一个实际场景 在开发中&#xff0c;新手程序员在查找错误时&#xff0c;这时有经验的程序员就会提示&#xff0c;可以用断点调试&#xff0c;一步一步的看源码执行的过程, 从而发现错误所在。 断点调试介绍 -基本介绍 2. 函数的调试

在不使用js在情况下只用css实现瀑布流效果

使用到的是grid 布局&#xff0c;需要注意的是grid-template-rows: masonry; 目前只有Firefox 浏览器支持这个效果&#xff0c;而且还是一个实验性属性需要在设置里面开发实验性选项才行。 实例 <!DOCTYPE html> <html> <head><title>Document</ti…

某国资集团数据治理落地,点燃高质量发展“数字引擎”

​某国有资产经营控股集团为快速提升集团的内控管理能力和业务经营能力&#xff0c;以数字化促进企业转型的信息化建设势在必行。集团携手亿信华辰开启数据治理项目&#xff0c;在数据方面成功解决“哪里来、怎么盘、怎么管、怎么用”的问题&#xff0c;不断推动企业数字化转型…

焦化行业排放平台简介

在当今社会&#xff0c;环保事业日益受到人们的关注。焦化行业作为重要的工业领域之一&#xff0c;其排放问题一直是环保工作的重点。为了有效控制焦化行业的排放&#xff0c;实施焦化行业排放平台成为了必不可少的措施。朗观视觉小编将详细探讨焦化行业排放平台的实施范围&…

vue技巧(十)全局配置使用(打包后可修改配置文件)

1、背景 vue打包目前主流用的有webpack和vite两种&#xff0c;默认用的webpack。&#xff08;二者的区别大家可以各自上网查&#xff0c;我没用过vite&#xff0c;所以不过多介绍&#xff09;vue通过webpack打包后&#xff0c;源码会被压缩&#xff0c;但一些关键配置可…

YOLOv10在RK3588上的测试(进行中...)

1.代码源 国内镜像站在gitcode。这个镜像站也基本上包含了github上常用项目的镜像。然后它的主发布源在这里&#xff1a; GitCode - 全球开发者的开源社区,开源代码托管平台 yolov10是清华主导做的... 然后&#xff0c;在维护列表里看到了这个&#xff1a; 2024年05月31日&am…

前端项目打包部署

打包 vue-cli脚手架的前端项目&#xff0c;点击npm脚本中的第二条编译命令&#xff0c;即可将项目编译&#xff0c;生成一个dist的文件夹&#xff0c;里面存放的就是编译好的前端项目文件&#xff0c;没有脚手架就在终端敲击npm run build命令编译前端项目 部署 Nginx 介绍:…

centos7 最简单方式安装xfce 4桌面环境

本快速指南将介绍如何在CentOS 7上安装Xfce桌面&#xff0c;该桌面将提供用于Linux系统的GUI。 Xfce是一个用于Unix之类的轻量级桌面环境&#xff0c;类似于操作系统&#xff0c;其目标是快速而又节省系统资源。 首先&#xff0c;我们需要配置EPEL存储库&#xff0c;因为这是…

Calibre版图验证工具调用_笔记

Siemens EDA Calibre版图验证工具调用 采用Cadence Virtuoso Layout Editor直接调用Siemens EDA Calibre工具需要进行文件设置&#xff0c; 在用户的根目录下&#xff0c;找到.cdsinit文件&#xff0c; 在文件的结尾处添加以下语句即可&#xff0c;其中&#xff0c;calibre.skl…

Kafka多维度调优

优化金字塔 应用程序层面 框架层面&#xff08;Broker层面&#xff09; JVM层面 操作系统层面 应用程序层面&#xff1a;应当优化业务代码合理使用kafka&#xff0c;合理规划主题&#xff0c;合理规划分区&#xff0c;合理设计数据结构&#xff1b; 框架层面&#xff1a;在不…

全面了解性格测试:探索你的内在世界

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 全面了解性格测试&#xff1a;探索你的内在世界 什么是性格测试&#xff1f; 定义和概念 &#x1f9e0; …

2006-2024年款别克君越维修手册和电路图资料更新

经过整理&#xff0c;2006-2024年款别克君越&#xff08;含君越混动版&#xff09;全系列已经更新至汽修帮手资料库内&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针…

Oracle 打开钱包 ORA-28368: cannot auto-create wallet

ORA-28368: cannot auto-create wallet 开启钱包抱错&#xff0c;看下钱包信息 SQL> select * from v$encryption_wallet;WRL_TYPE -------------------- WRL_PARAMETER -------------------------------------------------------------------------------- STATUS ------…

直播录制怎么录?(3个方法)

在数字化快速发展的今天&#xff0c;直播已经成为了一种重要的传播方式&#xff0c;无论是商业活动、教育培训&#xff0c;还是娱乐休闲&#xff0c;直播都展现出了其独特的价值。然而&#xff0c;直播的即时性也意味着一旦错过&#xff0c;就很难再次体验。这时&#xff0c;直…

RTSP/Onvif安防视频监控系统EasyNVR录像播放时间轴与设备时间对应不上的原因

视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。平台可提供视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频能力&#xf…

雷卯推出小封装高压防静电二极管SD60C

1. 高电压通讯信号线静电防护的为何有难度 高电压通讯信号线静电防护很多公司普遍可以做到1.8至36V,48V ESD静电防护&#xff0c;比如上海雷卯的36V ESD二极管SD36C&#xff0c;LC36CI&#xff0c;GBLC36C ,分别可以用于低数据速率到高数据速率静电防护。48V 的ESD二极管有SD4…

代码随想录算法训练营第二十二天| 235. 二叉搜索树的最近公共祖先、 701.二叉搜索树中的插入操作、 450.删除二叉搜索树中的节点

235. 二叉搜索树的最近公共祖先 题目链接&#xff1a;235. 二叉搜索树的最近公共祖先 文档讲解&#xff1a;代码随想录 状态&#xff1a;只会昨天的方法&#xff0c;没有想到利用二叉搜索树的性质。 思路&#xff1a; 如果当前节点的值同时小于 p 和 q 的值&#xff0c;说明 p …

从报名到领证:软考初级【信息系统运行管理员】报名考试全攻略

本文共计9991字&#xff0c;预计阅读33分钟。包括七个篇章&#xff1a;报名、准考证打印、备考、考试、成绩查询、证书领取及常见问题。 一、报名篇 报名条件要求&#xff1a; 1.凡遵守中华人民共和国宪法和各项法律&#xff0c;恪守职业道德&#xff0c;具有一定计算机技术…