CSDN每日一练:蛇形矩阵

news2024/10/5 15:25:25

题目名称:蛇形矩阵
时间限制:1000ms内存限制:256M
题目描述
给你一个整数n,输出n∗n的蛇形矩阵。

输入描述:
输入一行,包含一个整数n

输出描述:
输出n行,每行包含n个正整数,通过空格分隔。

示例
示例1
输入
4
输出
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16

提示

嗯,这个题目其实不算复杂,嗯,想起来一个菱形的题目,和这个差不多

矩阵
1 2
3 4
菱形
 1
3   2
 4

矩阵
1 2 6
3 5 7
4 8 9
菱形
  1
 3   2
4   5   6
 8  7
  9

先不管顺序问题,这个数字填写得数量都是一致的了,菱形偶数行(0,2,4…)填写单数个数字,需要正向填写,单数行(1,3,5…)逆向填写

所以,第一个版本的方法就出来了

n = 6
dp = [[0]*n for _ in range(n)]
s = 0
for i in range(n):
    for j in range(i+1):
        s += 1
        if i % 2 == 0:
            dp[i - j][j] = s
        else:
            dp[j][i - j] = s
            
print('\n'.join([' '.join([str(i) for i in j]) for j in dp]))

在这里插入图片描述

菱形的上半部分就算完成了,不过把菱形的位置换算成了矩阵的位置
然后,再循环一次,将后半部分补全,用长度n来减去行列下标得到后半的下标就可以补全了

n = 8
dp = [[0]*n for _ in range(n)]
s = 0
for i in range(n):
    for j in range(i+1):
        s += 1
        if i % 2 == 0:
            dp[i - j][j] = s
        else:
            dp[j][i - j] = s

for i in range(n-1,0,-1):
    for j in range(j):
        s+=1
        if i % 2 == 0:
            dp[n-i+j][n-j-1] = s
        else:
            dp[n-j-1][n-i+j] = s

print('\n'.join([' '.join([str(i) for i in j]) for j in dp]))

在这里插入图片描述
其实,到了这里,提交就已经可以通过了,但是,需要前半部分和后半部分分开计算。。。。老顾突然脑子就又抽抽了一下,想弄一个可以直接两层循环全部填完的办法

主要想法来源是,第二行的数字,都是上一行后一位的数字要么加1,要么减1。。。。。。
于是就需要先把第一行的数字全都计算出来了,经过一番研究,发现第一行偶数位置的数字存在一个规律

1 1 + 0 * 4
6 1 + 0 * 4 + 1 + 1 * 4
15 1 + 0 * 4 + 1 + 1 * 4 + 1 + 2 * 4
28 1 + 0 * 4 + 1 + 1 * 4 + 1 + 2 * 4 + 1 + 3 * 4

所以,第一行的数字就得出来了,比如n=10的时候

n = 10

j = 0
t = []
for i in range(n):
    j += i*4+1
    t.append(j)
# t = [1,6,15,28,45,66,91,120,153,190]

所以,第一行的数字,也出来了

1 2 6 7 15 16 28 29 45 46 66 67 91 92 120 121 153 154 190 191

嗯,这个数字实际上是n的2倍了。。。计算第一行数字时,忘记减半计算了,算了,就这样把

生成一个二维数组,然后把第一行数字填上去

n = 10

j = 0
t = []
for i in range(n):
    j += i*4+1
    t.append(j)

dp = [[0]*n for _ in range(n)]
for j in range(n):
    if j%2==0:
        dp[0][j] = t[j//2]
    else:
        dp[0][j] = t[j//2]+1

在这里插入图片描述
然后计算第二行的数字,如果不是最后一列,基本上可以从上一行的数字得到该位置的数字,所以得到第一部分计算

for i in range(1,n):
    for j in range(n):
        if j<n-1:
            if (i+j)%2==0:
                dp[i][j] = dp[i-1][j+1]-1
            else:
                dp[i][j] = dp[i-1][j+1]+1

在这里插入图片描述
因为正好第二行最后一个数字无法从上一行取得,所以后半部分得到的数字都是错的
然后,我们发现,另外的规律,第二行加第十列(1+9)是偶数,则无法从上一行最后一列的数字得到结果,是单数行时,则可以直接用上一行的数字加1得到结果,所以先完成单数行的计算,这次我们把 n 设置成一个单数,然后行列和为单数的先完成

n = 9

j = 0
t = []
for i in range(n):
    j += i*4+1
    t.append(j)

dp = [[0]*n for _ in range(n)]
for j in range(n):
    if j%2==0:
        dp[0][j] = t[j//2]
    else:
        dp[0][j] = t[j//2]+1
    

for i in range(1,n):
    for j in range(n):
        if j<n-1:
            if (i+j)%2==0:
                dp[i][j] = dp[i-1][j+1]-1
            else:
                dp[i][j] = dp[i-1][j+1]+1
        elif (i+j)%2==1:
            dp[i][j] = dp[i-1][j]+1

print('\n'.join([' '.join([str(i) for i in j]) for j in dp]))

在这里插入图片描述
最后,想办法得到偶数行最后一列的数字,嗯。。。。。推算出一个公式。。。偶数行最后一列的数字是

n**2 - (n-行号)**2+(n-行号)//2
注:行列和为偶数时计算最后一列数字

嗯。。。脑子抽抽了猜去研究这个怎么计算,最后得到完整结果

n = 9

j = 0
t = []
for i in range(n):
    j += i*4+1
    t.append(j)

dp = [[0]*n for _ in range(n)]
for j in range(n):
    if j%2==0:
        dp[0][j] = t[j//2]
    else:
        dp[0][j] = t[j//2]+1
    

for i in range(1,n):
    for j in range(n):
        if j<n-1:
            if (i+j)%2==0:
                dp[i][j] = dp[i-1][j+1]-1
            else:
                dp[i][j] = dp[i-1][j+1]+1
        elif (i+j)%2==1:
            dp[i][j] = dp[i-1][j]+1
        else:
            dp[i][j] = n**2-(n-i)*(n-i)//2+(n-i)//2


print('\n'.join([' '.join([str(i) for i in j]) for j in dp]))

至于复杂度,老顾没研究过,不知道怎么评价这两个的复杂度
第一办法是 O((n-1)^2 * 2)?第二个办法是 O(n^2)?

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

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

相关文章

【重磅】IEEE33配电网两阶段鲁棒优化调度CCG

目录 1 前言 2基本内容 2.1 配网两阶段鲁棒模型 2.2 求解步骤 3部分程序 4程序结果 5程序链接 1 前言 鲁棒优化是电力系统研究的热点&#xff0c;而两阶段鲁棒和分布鲁棒研究就成为各类期刊&#xff08;sci/ei/核心&#xff09;的宠儿&#xff0c;最简单的思路是通过改…

影像组学|案例流程复现

对一篇影像组学的的论文&#xff08;《Development and validation of an MRI-based radiomics nomogram for distinguishing Warthin’s tumour from pleomorphic adenomas of the parotid gland》&#xff09;中方法进行复现。完整地跑通影像组学全流程&#xff0c;对临床影像…

Alibaba微服务组件Nacos配置中心

目录 Nacos配置中心使用 springcloud config 对比 快速开始 搭建nacos-config服务 Config相关配置 配置的优先级 RefreshScope Nacos配置中心使用 官方文档&#xff1a; Nacos config alibaba/spring-cloud-alibaba Wiki GitHub Nacos 提供用于存储配置和其他元数据…

链表基本原理

链表基本原理1.链表1.1 基本原理1.2 链表大O记法表示2. 链表操作2.1 读取2.2 查找2.3 插入2.4 删除3.链表代码实现1.链表 1.1 基本原理 节点 组成链表的数据格子不是连续的。可以分布在内存的各个位置。这种不相邻的格子就叫结点。每个结点保存数据还保存着链表里的下一结点的…

Leetcode—移除元素、删除有序数组中的重复项、合并两个有序数组

移除元素 此题简单&#xff0c;用双指针方法即可&#xff0c; 如果右指针指向的元素不等于val&#xff0c;它一定是输出数组的一个元素&#xff0c;我们就将右指针指向的元素复制到左指针位置&#xff0c;然后将左右指针同时右移&#xff1b; 如果右指针指向的元素等于 val&…

04 OpenCV位平面分解

1 基本概念 位平面分解的核心思想是将图像的每一个像素分解为多个二进制位&#xff0c;分别存储在不同的位平面上。例如&#xff0c;如果一个图像是8位深度的&#xff0c;则可以分解为8个位平面&#xff0c;每个位平面上存储一个二进制位。 位平面分解在图像压缩中有着重要的…

对Node.js 的理解?优缺点?应用场景?

一、是什么 Node.js 是一个开源与跨平台的 JavaScript 运行时环境 在浏览器外运行 V8 JavaScript 引擎&#xff08;Google Chrome 的内核&#xff09;&#xff0c;利用事件驱动、非阻塞和异步输入输出模型等技术提高性能 可以理解为 Node.js 就是一个服务器端的、非阻塞式I/…

中国计算机设计大赛来啦!用飞桨驱动智慧救援机器狗

‍‍中国大学生计算机设计大赛是我国高校面向本科生最早的赛事之一&#xff0c;自2008年开赛至今&#xff0c;一直由教育部高校与计算机相关教指委等或独立或联合主办。大赛的目的是以赛促学、以赛促教、以赛促创&#xff0c;为国家培养德智体美劳全面发展的创新型、复合型、应…

保姆级Vue3+Vite项目实战多布局(下)

写在前面注&#xff1a;本文首发掘金签约专栏&#xff0c;此文为文章同步&#xff01;本文为 Vue3Vite 项目实战系列教程文章第三篇&#xff0c;系列文章建议从头观看效果更佳&#xff0c;大家可关注专栏防走失&#xff01;点个赞再看有助于全文完整阅读&#xff01;此系列文章…

如何在 C++ 应用程序中集成 Spire.XLS for C++

Spire.XLS for C 是一个 Excel 库&#xff0c;供开发人员在任何类型的 C 应用程序中操作 Excel 文档&#xff08;XLS、XLSX、XLSB 和 XLSM&#xff09;。 本文演示了如何以两种不同的方式将 Spire.XLS for C 集成到您的 C 应用程序中。 通过 NuGet 安装Spire.XLS for C通过手动…

一篇文章带你读懂HashMap

HashMap是面试中经常问到的一个知识点,也是判断一个候选人基础是否扎实的标准之一。可见HashMap的掌握是多重要。 一、HashMap源码分析 1、构造函数 让我们先从构造函数说起&#xff0c;HashMap有四个构造方法&#xff0c;别慌 1.1 HashMap() // 1.无参构造方法、// 构造一…

企业数字化转型和升级:架构设计方法与实践

企业架构整体结构图例&#xff1a;企业架构整体结构企业架构整体结构从战略层、规划层、落地层这三层来分别对应企业架构中业务、架构和实施的各种重要活动和产出。业务架构&#xff0c;数据架构&#xff0c;应用架构和技术架构之间的内在逻辑联系:图例&#xff1a;企业架构整体…

什么,Excel竟然听得懂人话!?!

Excel知道我们想干啥&#xff0c;不相信&#xff1f;看下面的案例。“数据格式”列中规定了各种数据元类型的长度、保留位数等&#xff0c;我们需要提取对应的数值作为“字段长度”列。比如an..100取100&#xff0c;n4取4&#xff0c;an..100,3取100&#xff0c;..ul取1000&…

C语言学习笔记-排序算法

选择排序 选择排序&#xff08;Selection sort&#xff09;是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放到排序序列的起始位置&#xff0c;然后&#xff0c;再从剩余未排序元素中继续寻找最小&…

元宇宙营销面临的三大挑战

元宇宙的营销就像在早期的互联网建立一个网站一样&#xff0c;你没有多少可以向过去借鉴的&#xff0c;这个领域一切都是崭新的。对于一个实验性很强的项目而言&#xff0c;你很难知道要投入多少的时间和资源&#xff0c;而且这个项目也不一定能保障收益以及满足其他的一些关键…

[小记]注入服务进程/跨session注入

最近测试注入遇到一个问题&#xff1a;OpenProcess 失败&#xff0c;报错码&#xff1a;5&#xff0c;没有权限。 问题排查&#xff1a; 1&#xff0c;是否是管理员权限启动程序&#xff1f; 是 2&#xff0c;注入的目标进程有什么特殊&#xff1f; 目标进程是svchost.exe&…

【PyQt】PyQt学习(二)模块介绍+QObject学习

简介 PyQt API 是一组包含大量类和函数的模块。核心模块如下&#xff1a; QtGui&#xff1a;包含了窗口系统、事件处理&#xff08;QEvent&#xff09;、2D 图像&#xff08;QImage&#xff09;、基本绘画、字体&#xff08;QFont&#xff09;和文字类&#xff1b;QtCore&…

02.13:监督学习中的分类问题

今天首先学习了监督学习中的分类问题&#xff0c;跑了两个代码。现在学起来感觉机器学习有很多不同的定理建立了不同的分类器&#xff0c;也就是所谓不同的方法。具体的数学原理我不太清楚。然后不同的应用场景有一个最优的分类器。 值得一提的应该就是终于清晰的明白了精度&am…

IDEA 中使用 Git 图文教程详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

记录一次time_wait与close_wait的检查

框架与语言&#xff1a;php tp6swoole 原因&#xff1a;每隔几天就会出现,redis:Cannot assign requested address 开始想法&#xff0c;谷歌、百度。然后结果都是配置系统参数。比如下面例子 vi /etc/sysctl.confvm.overcommit_memory 1 net.core.somaxconn 6024 net.ip…