【LeetCode每天一题】Spiral Matrix(螺旋打印数组)
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
Example 1:
Input:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]
Example 2:
Input:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7] 思路
这到题的思路不难,但是在边界的处理上非常复杂。自己做了好一会也没能ac,看了以下solution写的也是听复杂度,最后看到了一个简单易懂的答案。具体思路是 我们设置一个up、down、left、right变量,来进行遍历。循环的条件就是up < down and left < right ,(and 是防止出现3*2 这种矩阵,因为下面还要继续进行殊处理) 每次循环完毕之后up, left加1, down, right减1。循环内部进行四次循环,分别添加每一层的数字。直到外层循环结束。最后在判断特殊的比如2*3这种矩阵。时间复杂度为O(m*n), 空间复杂度为O(N)(N为元素总个数)
解决代码
class Solution(object):
def spiralOrder(self, nums):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
if not nums:
return [] m , n = len(nums), len(nums[0])
up, down, left, right = 0, m-1, 0, n-1 # 设置上下左右变量。
res = []
while up < down and left < right: # 循环条件
for i in range(left, right): # 打印当前层的上半部分
res.append(nums[up][i]) for i in range(up, down): # 打印当前层的右半部部分
res.append(nums[i][right]) for i in range( right, left,-1): # 打印当前层的下边部分
res.append(nums[down][i])
for i in range(down, up, -1): # 打印当前层的左半部分
res.append(nums[i][left])
up, down, left, right = up+1, down-1, left+1, right-1 if left == right: # 如果左等于右,说明可能存在2*3 这种形式的矩阵,将最里面的一层添加
res.extend([nums[i][right] for i in range(up, down + 1)])
elif up == down: # 如果上等于下, 说明可能存在3*2 这种类型的矩阵。
res.extend([nums[up][j] for j in range(left, right + 1)])
return res
【LeetCode每天一题】Spiral Matrix(螺旋打印数组)的更多相关文章
- Leetcode 54:Spiral Matrix 螺旋矩阵
54:Spiral Matrix 螺旋矩阵 Given a matrix of m x n elements (m rows, n columns), return all elements of t ...
- LeetCode(59)SPiral Matrix II
题目 Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. F ...
- 【js】Leetcode每日一题-解码异或后数组
[js]Leetcode每日一题-解码异或后数组 [题目描述] 未知 整数数组 arr 由 n 个非负整数组成. 经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encode ...
- [LeetCode每日一题]153.寻找旋转排序数组中的最小值
[LeetCode每日一题]153.寻找旋转排序数组中的最小值 问题 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1, ...
- [LeetCode每日一题]81. 搜索旋转排序数组 II
[LeetCode每日一题]81. 搜索旋转排序数组 II 问题 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 & ...
- 【python】【补】Leetcode每日一题-合并两个有序数组
[python]Leetcode每日一题-合并两个有序数组 [题目描述] 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组 ...
- [LeetCode] Spiral Matrix 螺旋矩阵
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...
- leetCode 54.Spiral Matrix(螺旋矩阵) 解题思路和方法
Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matri ...
- PAT甲级——1105 Spiral Matrix (螺旋矩阵)
此文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90484058 1105 Spiral Matrix (25 分) ...
随机推荐
- 判断回文字符串、回文链表、回文数(python实现)
所谓回文字符串,就是正读和反读都一样的字符串,比如"level"或者"noon"等等就是回文串.即是对称结构 判断回文字符串 方法一: def is_palin ...
- Cobalt Strike DNS通讯实例
一.域名设置 如果没有域名,可以参考另一篇博客,申请Freenom免费域名,并使用DNSPod解析 链接:https://www.cnblogs.com/ssooking/p/6364639.html ...
- Maven知识总结(转)
原文地址:http://blog.csdn.net/caihaijiang/article/details/6664910 1.Maven内置变量说明: ${basedir} 项目根目录 ${proj ...
- Android Studio中解决jar包重复依赖导致的代码编译错误
在原本的代码中已经使用了OKHTTP和rxjava,然后今天依赖retrofit的时候一直报错 Program type already present: okhttp3.internal.ws.Re ...
- Cesium简单使用
CesiumJS是一个基于javascript的浏览器器3d地图引擎 下载 https://cesiumjs.org/downloads/ 下载的Cesium-1.56.1,解压后的结构为 1.设置W ...
- mysql问题解决SELECT list is not in GROUP BY clause and contains nonaggregated column
今天在Ubuntu下的部署项目,发现一些好好的列表页面发生 :Expression # of SELECT list is not in GROUP BY clause and contains no ...
- TimeUnit类中的sleep() 和Thread.sleep()
TimeUnit是什么? TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的线程暂停操作,通常用来替换Thread.sleep(),在很长一段 ...
- 阿里云申请免费https证书 + IIS服务器安装
参考: 阿里云免费SSL证书申请与安装使用(IIS7)
- 8051汇编:EQU指令
关于EQU汇编指令 EQU是英文单词equal的缩写,因此我们也能对EQU指令有一个初步的认识:做等价替换使用. 在8051汇编语言中,EQU用于定义一个符号常量,其效果不会带来存储空间的占用(这和C ...
- Postgresql 查看锁的过程
一.查看sql语句是否发生死锁 1.查看数据库的进程.SELECT * FROM pg_stat_activity WHERE datname='死锁的数据库ID ';检索出来的字段中,[wating ...