python5种算法模拟螺旋、分层填充、递归、迭代、分治实现螺旋矩阵ll【力扣题59】

本文主要是介绍python5种算法模拟螺旋、分层填充、递归、迭代、分治实现螺旋矩阵ll【力扣题59】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。
会一些的技术:数据分析、算法、SQL、大数据相关、python
欢迎加入社区:码上找工作
作者专栏每日更新:
LeetCode解锁1000题: 打怪升级之旅
python数据分析可视化:企业实战案例
备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉 一起打怪升级

题目描述

给你一个正整数 n,生成一个包含 1n^2 所有元素的 n x n 正方形矩阵,数组的元素按螺旋顺序依次填充。

输入格式
  • n:一个正整数,表示矩阵的大小。
输出格式
  • 返回一个 n x n 的数组,按螺旋顺序填充从 1n^2 的整数。
示例 1
输入: n = 3
输出: [[1,2,3],[8,9,4],[7,6,5]]

方法一:模拟螺旋填充

解题步骤
  1. 初始化矩阵:创建一个 n x n 的矩阵,初始填充值为 0
  2. 螺旋遍历:定义四个方向,模拟螺旋遍历的过程,按顺序填入数字。
  3. 边界条件处理:在填充过程中,需要不断检查下一个位置是否超出边界或已被填充。
完整的规范代码
def generateMatrix(n):"""使用模拟螺旋遍历的方法生成螺旋矩阵:param n: int, 矩阵的大小:return: List[List[int]], 螺旋矩阵"""matrix = [[0] * n for _ in range(n)]directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # right, down, left, uprow, col, di = 0, 0, 0for i in range(1, n*n + 1):matrix[row][col] = idr, dc = directions[di]if not (0 <= row + dr < n and 0 <= col + dc < n and matrix[row + dr][col + dc] == 0):di = (di + 1) % 4  # Change directiondr, dc = directions[di]row, col = row + dr, col + dcreturn matrix# 示例调用
print(generateMatrix(3))  # 输出: [[1, 2, 3], [8, 9, 4], [7, 6, 5]]
算法分析
  • 时间复杂度:(O(n^2)),其中 n 是矩阵的维度,需要填充 n^2 个元素。
  • 空间复杂度:(O(n^2)),用于存储生成的矩阵。

方法二:分层填充法

解题步骤
  1. 定义边界:设置上下左右四个边界,控制填充范围。
  2. 外层到内层填充:按层模拟填充过程,每完成一圈缩小填充范围。
  3. 逐层填充:按照右下左上的顺序逐层填充,每填完一全圈,四个边界向内缩进。
完整的规范代码
def generateMatrix(n):"""使用分层填充法生成螺旋矩阵:param n: int, 矩阵的大小:return: List[List[int]], 螺旋矩阵"""matrix = [[0] * n for _ in range(n)]left, right, top, bottom = 0, n-1, 0, n-1num = 1while left <= right and top <= bottom:for i in range(left, right + 1):matrix[top][i] = numnum += 1top += 1for i in range(top, bottom + 1):matrix[i][right] = numnum += 1right -= 1if top <= bottom:for i in range(right, left - 1, -1):matrix[bottom][i] = numnum += 1bottom -= 1if left <= right:for i in range(bottom, top - 1, -1):matrix[i][left] = numnum += 1left += 1return matrix# 示例调用
print(generateMatrix(3))  # 输出: [[1, 2, 3], [8, 9, 4], [7, 6, 5]]
算法分析
  • 时间复杂度:(O(n^2)),必须填充所有 n^2 个元素。
  • 空间复杂度:(O(n^2)),用于存储生成的矩阵。

方法三:递归填充

解题步骤
  1. 递归函数定义:定义一个递归函数用于填充每一层。
  2. 递归填充:从外层向内层递归填充,每次递归填充一圈。
  3. 终止条件:当填充完成或只剩下一行/一列时终止递归。
完整的规范代码
def generateMatrix(n):"""使用递归方法生成螺旋矩阵:param n: int, 矩阵的大小:return: List[List[int]], 螺旋矩阵"""matrix = [[0] * n for _ in range(n)]fill(matrix, 0, n, 1)return matrixdef fill(matrix, start, n, val):if n <= 0:returnif n == 1:matrix[start][start] = valreturnfor i in range(n - 1):matrix[start][start + i] = valval += 1for i in range(n - 1):matrix[start + i][start + n - 1] = valval += 1for i in range(n - 1):matrix[start + n - 1][start + n - 1 - i] = valval += 1for i in range(n - 1):matrix[start + n - 1 - i][start] = valval += 1fill(matrix, start + 1, n - 2, val)# 示例调用
print(generateMatrix(3))  # 输出: [[1, 2, 3], [8, 9, 4], [7, 6, 5]]
算法分析
  • 时间复杂度:(O(n^2)),需要填充所有 n^2 个元素。
  • 空间复杂度:(O(n^2)),用于存储生成的矩阵,加上递归栈的开销(最坏情况下为 (O(n)))。

方法四:迭代展开

解题步骤
  1. 初始化变量:定义矩阵、起始点、方向等变量。
  2. 迭代填充:通过迭代的方式填充矩阵,类似于方法一但避免了方向切换的复杂判断。
  3. 边界处理:在迭代中处理矩阵边界和已填充元素的情况。
完整的规范代码
def generateMatrix(n):"""使用迭代展开的方法生成螺旋矩阵:param n: int, 矩阵的大小:return: List[List[int]], 螺旋矩阵"""matrix = [[0] * n for _ in range(n)]x, y, dx, dy = 0, 0, 0, 1for i in range(1, n*n+1):matrix[x][y] = iif matrix[(x+dx)%n][(y+dy)%n]:dx, dy = dy, -dxx, y = x + dx, y + dyreturn matrix# 示例调用
print(generateMatrix(3))  # 输出: [[1, 2, 3], [8, 9, 4], [7, 6, 5]]
算法分析
  • 时间复杂度:(O(n^2)),需要填充所有 n^2 个元素。
  • 空间复杂度:(O(n^2)),用于存储生成的矩阵。

方法五:分治填充

解题步骤
  1. 定义填充函数:创建一个函数用于填充矩阵的一圈。
  2. 分治递归:递归地填充外圈后,对内层矩阵进行相同操作。
  3. 终止与初始化:当矩阵大小减小到1或0时终止递归。
完整的规范代码
def generateMatrix(n):"""使用分治填充法生成螺旋矩阵:param n: int, 矩阵的大小:return: List[List[int]], 螺旋矩阵"""matrix = [[0] * n for _ in range(n)]fill_layer(matrix, 0, n, 1)return matrixdef fill_layer(matrix, start, size, start_val):if size <= 0:returnif size == 1:matrix[start][start] = start_valreturn# Fill the perimeterfor i in range(size - 1):matrix[start][start+i] = start_valstart_val += 1for i in range(size - 1):matrix[start+i][start+size-1] = start_valstart_val += 1for i in range(size - 1):matrix[start+size-1][start+size-1-i] = start_valstart_val += 1for i in range(size - 1):matrix[start+size-1-i][start] = start_valstart_val += 1fill_layer(matrix, start+1, size-2, start_val)# 示例调用
print(generateMatrix(3))  # 输出: [[1, 2, 3], [8, 9, 4], [7, 6, 5]]
算法分析
  • 时间复杂度:(O(n^2)),需要填充所有 n^2 个元素。
  • 空间复杂度:(O(n^2)),用于存储生成的矩阵,递归栈深度依矩阵大小而定。

不同算法的优劣势对比

特征方法一: 模拟螺旋填充方法二: 分层填充法方法三: 递归填充方法四: 迭代展开方法五: 分治填充
时间复杂度(O(n^2))(O(n^2))(O(n^2))(O(n^2))(O(n^2))
空间复杂度(O(n^2))(O(n^2))(O(n^2))(O(n^2))(O(n^2))
优势直观易理解清晰结构化结构简单代码简洁递归清晰,易于理解
劣势稍微复杂的控制流多次循环递归深度问题边界处理复杂空间使用多,递归深度

应用示例

游戏开发
在游戏开发中,尤其是需要生成迷宫或特定图案的场景设计里,螺旋矩阵可以用于设计关卡的地图布局,例如生成螺旋迷宫地图,增加游戏的趣味性和挑战性。

通过上述方法,开发者可以选择最适合其应用场景的算法来实现高效、可靠的矩阵生成功能。

这篇关于python5种算法模拟螺旋、分层填充、递归、迭代、分治实现螺旋矩阵ll【力扣题59】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/928531

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo