力扣刷题-数组-螺旋矩阵

模拟过程,但却十分考察对代码的掌控能力。
重点:循环不变量原则!
第一条原则:
模拟顺时针画矩阵的过程:

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上

由外向内一圈一圈这么画下去。
第二条原则:
左闭右开原则!
这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。
image.png
这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。这也是坚持了每条边左闭右开的原则。

59.螺旋矩阵II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
image.png
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

class Solution(object):def generateMatrix(self, n):""":type n: int:rtype: List[List[int]]"""# 螺旋矩阵 重点考察代码能力 不涉及算法# 遇到判断循环边界的题目 要遵循 循环不变量 1. 上下行 左右列的遍历原则 2. 左闭右开原则result = [[0]*n for _ in range(n)]startx ,starty = 0, 0 # 起始位置 因为一般是循环里面用i j loop = n // 2 # 循环个数 需要转几个圈mid = n // 2 # 若n为奇数 需要单独处理中间的一个数 result[mid][mid]offset = 1 # 第一圈offset当然为1 下一圈需要再加1 offset目的就是保持左闭右开原则count = 1 # 计数 就是每个位置填充的数# 开始循环while loop > 0:i = startx # 对于不同循环 每次起始的x y 不一样j = starty# 上行 左闭右开for j in range(starty, n-offset):result[startx][j] = countcount += 1j += 1# 右列for i in range(startx, n-offset):result[i][j] = countcount += 1i += 1# 下行while j > starty:result[i][j] = countcount += 1j -= 1# 左列while i > startx:result[i][j] = countcount += 1i -= 1loop -= 1 # 循环数减1offset += 1 # offset加1startx += 1starty += 1if n %2 :result[mid][mid] = countreturn result

54.螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:(方阵)
image.png
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
image.png
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
解题:
与59.螺旋矩阵II相同的是:两者都是模拟矩形的顺时针旋转,所以核心依然是依然是坚持循环不变量,按照左闭右开的原则
与59.螺旋矩阵II不同的是:前题中的螺旋矩阵是正方形,只有正方形的边长n一个边界条件,而本题中,需要考虑长方形的长和宽(m行和n列)两个边界条件。自然,m可以等于n,即前题可视为本题在m==n的特殊情况。
我们从最一般的情况开始考虑,与59.螺旋矩阵II题解对比起来,m和n的带入,主要引来两方面的差异:

  • **loop的计算: **本题的loop计算与59.螺旋矩阵II算法略微差异,因为存在rows和columns两个维度,可自行分析,loop只能取min(rows, columns),例如rows = 5, columns = 7,那loop = 5 / 7 = 2
  • mid的计算及填充: 1、同样的原理,本题的mid计算也存在上述差异; 2、 如果min(rows, columns)为偶数,则不需要在最后单独考虑矩阵最中间位置的赋值 如果min(rows, columns)为奇数,则矩阵最中间位置不只是[mid][mid],而是会留下来一个特殊的中间行或者中间列,具体是中间行还是中间列,要看rows和columns的大小,如果rows > columns,则是中间列,相反,则是中间行

可以自己举例画图分析。

class Solution(object):def spiralOrder(self, matrix):""":type matrix: List[List[int]]:rtype: List[int]"""m = len(matrix) # 行数n = len(matrix[0]) # 列数result = []if m == n: # 当矩阵为方阵时startx, starty = 0, 0offset = 1loop = n // 2mid = n // 2while loop:i = startxj = starty# 上行for j in range(starty, n-offset):result.append(matrix[startx][j])j += 1# 右列for i in range(startx, n-offset):result.append(matrix[i][j])i += 1# 下行while j > starty:result.append(matrix[i][j])j -= 1# 左列while i > startx:result.append(matrix[i][j])loop -= 1offset += 1startx += 1starty += 1if n % 2:result.append(matrix[mid][mid])# m与n不等 则loop循环数量为 min(m,n) // 2 并且如果min(m,n)为奇数 则不再是中间位置 而可能是留下一行或者一列if m != n:startx, starty = 0, 0offset = 1loop = min(m ,n ) // 2mid = min(m, n) // 2while loop:i = startxj = startyfor j in range(starty, starty+n-offset): # 注意是startx+n-offsetresult.append(matrix[startx][j])j += 1for i in range(startx, startx+m-offset):result.append(matrix[i][j])i += 1while j > starty:result.append(matrix[i][j])j -= 1while i > startx:result.append(matrix[i][j])i -= 1loop -= 1offset += 2 # 注意这里要加2 因为外圈遍历完后,再遍历内圈,内圈的矩阵行和列相比外圈都少了两个长度startx += 1starty += 1# 处理额外的行/列数据if min(m,n)%2:if m>n: # 那就是额外的列for i in range(mid, mid+m-n+1):result.append(matrix[i][mid])else:for j in range(mid, mid+n-m+1):result.append(matrix[mid][j])return result

其实可以不用分:

class Solution(object):def spiralOrder(self, matrix):""":type matrix: List[List[int]]:rtype: List[int]"""m = len(matrix) # 行数n = len(matrix[0]) # 列数result = []# if m == n: # 当矩阵为方阵时#     startx, starty = 0, 0#     offset = 1#     loop = n // 2#     mid = n // 2#     while loop:#         i = startx#         j = starty#         # 上行#         for j in range(starty, n-offset):#             result.append(matrix[startx][j])#         j += 1#         # 右列#         for i in range(startx, n-offset):#             result.append(matrix[i][j])#         i += 1#         # 下行#         while j > starty:#             result.append(matrix[i][j])#             j -= 1#         # 左列#         while i > startx:#             result.append(matrix[i][j])#         loop -= 1#         offset += 1#         startx += 1#         starty += 1#     if n % 2:#         result.append(matrix[mid][mid])# m与n不等 则loop循环数量为 min(m,n) // 2 并且如果min(m,n)为奇数 则不再是中间位置 而可能是留下一行或者一列startx, starty = 0, 0offset = 1loop = min(m ,n ) // 2mid = min(m, n) // 2while loop:i = startxj = startyfor j in range(starty, starty+n-offset): # 注意是startx+n-offsetresult.append(matrix[startx][j])j += 1for i in range(startx, startx+m-offset):result.append(matrix[i][j])i += 1while j > starty:result.append(matrix[i][j])j -= 1while i > startx:result.append(matrix[i][j])i-=1loop -= 1offset += 2 # 注意这里要加2 因为外圈遍历完后,再遍历内圈,内圈的矩阵行和列相比外圈都少了两个长度startx += 1starty += 1# 处理额外的行/列数据if min(m,n)%2:if m>n: # 那就是额外的列for i in range(mid, mid+m-n+1):  # 注意是midresult.append(matrix[i][mid])else: # 那就是额外的行for j in range(mid, mid+n-m+1):result.append(matrix[mid][j])return result

重点在于考虑到m!=n时候如何判断循环圈数,以及什么时候要考虑循环完毕之后剩余的元素,以及如何处理。

参考:https://programmercarl.com/

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

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

相关文章

基于微信小程序的加油站服务管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言运行环境说明用户微信端的主要功能有:管理员的主要功能有:具体实现截图详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考论文参考源码获取 前言 💗博主介绍&#x…

八大排序(四)--------直接插入排序

本专栏内容为:八大排序汇总 通过本专栏的深入学习,你可以了解并掌握八大排序以及相关的排序算法。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:八大排序汇总 🚚代码仓库:小小unicorn的代码仓库…

1.(vue3.x+vite)封装组件

前端技术社区总目录(订阅之前请先查看该博客) 关联博客 2.(vue3.x+vite)组件注册并调用 1:创建组件目录package,并创建相关工程结构 2:编写组件内容(index.vue) 3:添加注册组件方法(index.js) 4:添加路由

平滑加权轮询算法java实现

实现代码 /*** 功能描述: 平滑加权轮询算法** author zhang pu* date 11:46 2023/9/22*/public static void smoothnessWeightPollLoadBalance() {Server serverA new Server("127.0.0.1", 5, 0);Server serverB new Server("127.0.0.2", 3, 0);Server s…

深度学习从入门到入土

1. 数据操作 N维数组样例 N维数组是机器学习和神经网络的主要数据结构 0-d 一个类别: 1.0 1-d 一个特征向量(一维矩阵):[1.0, 2.7, 3.4] 2-d 一个样本-特征矩阵-(二维矩阵) 3-d RGB图片 (宽x高x通道)- 三维数组 4-d 一个RGB…

React 全栈体系(十三)

第七章 redux 五、redux 异步编程 1. 理解 redux 默认是不能进行异步处理的,某些时候应用中需要在 redux 中执行异步任务(ajax, 定时器) 2. 使用异步中间件 npm install --save redux-thunk 3. 代码 - 异步 action 版 3.1 store /* src/redux/store.js */ /*** 该文件专…

大型集团借力泛微搭建语言汇率时区统一、业务协同的国际化OA系统

国际化、全球化集团,业务遍布全世界,下属公司众多,集团对管理方式和企业文化塑造有着很高的要求。不少大型集团以数字化方式助力全球统一办公,深化企业统一管理。 面对大型集团全球化的管理诉求,数字化办公系统作为集…

Matlab图像处理-模式识别

模式识别 模式识别就是用计算的方法根据样本的特征将样本划分到一定的类别中去。模式识别就是通过计算机用数学技术方法来研究模式的自动处理和判读,把环境与客体统称为“模式”。模式识别以图像处理与计算机视觉、语音语言信息处理、脑网络组、类脑智能等为主要研…

电脑桌面透明便签软件是哪个?

在现代快节奏的工作环境中,许多上班族都希望能够在电脑桌面上方便地记录工作资料、重要事项、工作流程等内容。为了解决这个问题,一款优秀的电脑桌面便签软件是必不可少的。在选择桌面便签软件时,许多用户也希望便签软件能够与电脑桌面壁纸相…

“淘宝” 开放平台接口设计思路(内附API接口免费接入地址)

最近对接的开放平台有点多,像淘宝、天猫、京东、拼多多、快手、抖音等电商平台的开放平台基本对接了个遍,什么是CRUD BODY也许就是这样的吧!!! 经过这几天的整理,脑子里大概有了个开放平台接口的设计套路&…

Linux Ubuntu命令行快速配置C++开发环境

本文介绍在Linux操作系统的Ubuntu版本中,基于命令行,快速配置C 编辑、编译、运行的代码开发环境的简便方法。 在之前的文章Linux操作系统Ubuntu 22.04配置Visual Studio Code与C代码开发环境的方法(https://blog.csdn.net/zhebushibiaoshifu/article/det…

版本控制系统git:一文了解git,以及它在生活中的应用,网站维护git代码,图导,自动化部署代码

目录 1.Git是什么 2.git在生活中的应用 2.1git自动化部署代码 3.网站维护git代码 3.1如何在Git代码托管平台等上创建一个仓库 3.2相关文章 4.ruby实现基础git 4.1.Git add 4.2 Git commit 4.3 Git log 1.Git是什么 Git是一个版本控制系统,它可以追踪文件的…

多边形碰撞检测算法

1、AABB碰撞检测算法 AABB碰撞检测指轴对齐碰撞箱(Axis-aligned Bounding Box),是分别从x轴向和y轴向进行碰撞检测的算法。即对于需要检测的物体A和物体B我们需要将其用A盒和B盒套起来,判断A盒和B盒在x轴向和y轴向是否发生碰撞,只有在x轴向和…

软件需求文档、设计文档、开发文档、运维文档大全

在软件开发过程中,文档扮演着至关重要的角色。它不仅记录了项目的需求、设计和开发过程,还为项目的维护和管理提供了便利。本文将详细介绍软件开发文档的重要性和作用,以及需求分析、软件设计、开发过程、运维管理和项目管理等方面的文档要求…

Flink--4、DateStream API(执行环境、源算子、基本转换算子)

星光下的赶路人star的个人主页 注意力的集中,意象的孤立绝缘,便是美感的态度的最大特点 文章目录 1、DataStream API1.1 执行环境(Execution Environment)1.1.1 创建执行环境 1.2 执行模式(Execution Mode)…

十六)Stable Diffusion教程:出图流程化

今天说一个流程化出图的案例,适用很多方面。 1、得到线稿,自己画或者图生图加线稿lora出线稿;如果想sd出图调整参数不那么频繁细致,则线稿的素描关系、层次、精深要表现出来,表现清楚。 2、文生图,seed随机…

Android中的缓存策略:LruCache和DiskLruCache

Android中的缓存策略:LruCache和DiskLruCache 导言 本篇文章主要是介绍Android中内置的两个缓存类的原理。所谓缓存,就是将获取的数据保存下来以便下次继续使用,这种技术尤其在网络请求和图片加载中有用,可以显著地提升App的性能…

原生js的animate()方法详解

1.介绍 Element 接口的 animate() 方法是创建一个新的 Animation 的便捷方法,将它应用于元素,然后运行动画。它将返回一个新建的 Animation 对象实例。 同时通过Element.getAnimations() 方法可获取元素所有的Animation实例。 2.语法 Element.animate…

【PLC GX Works2】创建一个工程

PLC GX Works2软件安装 https://www.jcpeixun.com/software/375 程序编写 1、工程中找到新建 2、新建 3、导航栏中选择第三行第一个,是全局软元件注释 4、修改软元件名x0为点动按钮,y1为电机,之后关闭即可。 5、左母线,右…

Spring Security 的身份验证绕过漏洞CVE-2023-34035

文章目录 0.前言漏洞漏洞介绍描述 1.参考文档2.基础介绍2.1 组件简介:2.2 漏洞简介: 3.解决方案3.1. 升级版本 0.前言 背景:公司收到关于 Spring Security 的一个身份验证绕过漏洞的通知,该漏洞被标识为 CVE-2023-34035 漏洞 高 …