解题思路:\

  1. 观察一下,螺旋数组其实是按圈走的,每一个圈的起始点都在对角线上(matrix[i][i]),但是一共有几个圈的起始点呢?如果是nn的那么就有n//2个起始点,如果是mn的那就是min(m*n)//2.如上图用圈画出来的起始点,这玩意还是自己画两个矩阵找找起始点比较好理解。
  2. 把圈数确定掉就好办了,要螺旋打印几个圈,就一个大循环控制循环次数为圈数
  3. 接下来想办法把每一圈的元素添加到结果列表里
  4. 对于每一圈来说,都会有从左到右、从上到下、从右到左、从下到上。接下来好好的扯一扯for循环里的4个内存for\

假设row = 6, col = 7(图片中的第二个矩阵)
6. 第一个内层for循环使用来控制从左到右的,所以确定range为range(i, col-i)
理由:当i为0的时候,range(0,7),由于range不包含最后一个元素,所以matrix[i][j]能取遍当前行的元素。当i为1的时候为range(0,6),且res.append(matrix[i][j])
7. 第二个内层for循环用来控制从上到下,所以确定range为range(i+1, row-i),i+1是为了避免四角的元素被遍历两次,row-i是为了刹住车,别跑到别人圈里面,且res.append(matrix[j][col-1-i])
8. 第三个内层for循环用来控制从右到左,range(i+1, col-i),这个i不具有方向性,就是用来控制循环次数的,不要想多了~真正的方向是由matrix[][]里面的索引确定的!if (row-1)-i > i是什么意思呢?想象中间只有一行的时候,第一个for就把所有事情解决掉了~matrix[row-1-i][col-1-j],行定住不动,列往左边收缩
9. 第四个for循环其实差不多,range(i+1, row-1-i)确定次数,千万不能以为从i+1开始就又是从上到下了,只是确定次数而已,真正导向的是matrix[row-1-j][i]。if i < (col-1)-i原理和第三个for一样,当只有一列的时候,从上到下即第二个for循环已经把这件事做了!
10. 其实观察一下就会发现,从左到右和从右到左的matrix里面的方向是反的,另外两个也是~

# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param matrix int整型二维数组
# @return int整型一维数组
#
class Solution:def spiralOrder(self , matrix: List[List[int]]) -> List[int]:# write code hereres = []if matrix == []:return []row = len(matrix)col = len(matrix[0])if row == 0 or col == 0:return resquanshu = (min(row, col)+1) // 2for i in range(quanshu):for j in range(i, col-i):res.append(matrix[i][j])for j in range(i+1, row-i):res.append(matrix[j][col-1-i])for j in range(i+1, col-i):if (row-1)-i > i:res.append(matrix[row-1-i][col-1-j])for j in range(i+1, row-1-i):if i < (col-1)-i:res.append(matrix[row-1-j][i])return res

果然,代码还是要多抄,抄多了读代码就很好理解,如果有解释偏颇甚至出错的情况、恳请指正,谢谢

螺旋矩阵【史上最详细解释】相关推荐

  1. 第四章 OAuth2.0规范(史上最详细解释)——获得授权

    为了请求访问令牌,客户端从资源所有者获得授权.授权表现为授权许可的形式,客户端用它请求访问令牌.OAuth定义了四种许可类型:授权码.隐式许可.资源所有者密码凭据和客户端凭据.它还提供了扩展机制定义其 ...

  2. 史上最详细Docker安装最新版Minio 带详解 绝对值得收藏!!! 让我们一起学会使用minio搭建属于自己的文件服务器!!走上白嫖之路!解决启动了但是浏览器访问不了的原因

    让我们一起学会使用minio搭建属于自己的文件服务器!!走上白嫖之路! WARNING: Console endpoint is listening on a dynamic port (34451) ...

  3. android qq消息数 拖拽动画,史上最详细仿QQ未读消息拖拽粘性效果的实现

    好久没写文章了,前段时间由于项目代码重构忙了一段时间,现在终于有点时间了就为大家带来一篇关于动画学习的自定义View:类似QQ消息拖拽的效果. 其实QQ当时更新的时候我还没注意到这个小红点是可以拖拽的 ...

  4. linux bios设置界面,BIOS怎么设置 史上最详细的bios设置图解教程

    BIOS怎么设置?下面百事网小编就为大家带来史上最详细的bios设置图解教程. 一 进入BIOS设置程序通常有以下三种方法 1.开机启动时按热键(最通用也最常用) 在开机时按下特定的热键可以进入BIO ...

  5. 史上最详细全中文 Cisco 3560交换机使用手册

    史上最详细全中文 Cisco 3560交换机使用手册 (末尾送交换机安全技术) 目 录 CISCO Catalyst 3560-E系列交换机的功能应用及安全解决方案 3 一.Cisco? Cataly ...

  6. 史上最详细网络基础知识

    网络技术的基本原理: 1. 网络层次划分 2. OSI七层网络模型 3. IP地址 4. 子网掩码及网络划分 5. ARP/RARP协议 6. 路由选择协议 7. TCP/IP协议 8. UDP协议 ...

  7. 速卖通php,史上最详细的速卖通选品技巧

    好的产品是基础,所以卖家要重视速卖通选品,想要做好速卖通选品就要学会一些速卖通选品技巧,这一次小编对速卖通选品技巧进行了大整理,最后整理出了史上最详细的速卖通选品技巧,一起看看吧! 速卖通选品技巧一: ...

  8. Flink:史上最详细的介绍(一)[简介]

    1.Flink简介 Flink:史上最详细的介绍(二)[架构体系] Flink:详细的不能再详细的安装步骤(三)[安装步骤] Flink:详细讲解FlinkFlink 运行架构(四)[运行架构] Fl ...

  9. 背包算法(一)-01背包-史上最详细解答

    背包算法(一)-01背包-史上最详细解答 1. 题目 2. 分析 2.1 状态表示 2.2 状态计算 3. 实现 4. 优化 5. 测试 1. 题目 问题描述:有n件物品和容量为m的背包,给出i件物品 ...

最新文章

  1. 仿人智能控制器的参数简化(已发表于《计算机测量与控制》2013年第4期)
  2. 哪些软件问题也可导致硬盘录像机死机
  3. MATLAB从入门到精通-Matlab R2020b新功能 | 子标题和标题/标签对齐功能!
  4. 奔跑吧linux内核_别了,Linux 的魔法时代!
  5. 遥感影像场景分类预测大赛——算法硬碰硬!
  6. 线程同步 互斥量(mutex) Linux函数
  7. d3.js中点可以用图片吗_WebGL 直线直吗?
  8. PRML 十大经典机器学习算法
  9. 官宣:两校合并,落户省会!
  10. 【读书】格鲁夫给经理人的第一课-管理杠杆率
  11. 正确介绍自己的项目,终于不用害怕面试了
  12. Doevents函数详解
  13. 我做出一个决定!(2-3nian后时间来证明对错!)
  14. 悟空活动中台 - 基于 WebP 的图片高性能加载方案
  15. JS图片360度全景预览插件
  16. 区块链以价值开启“大版权时代”
  17. C# npoi读execel 未能加载文件或程序集“ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neut al, PublicKeyTok
  18. ifix如何设画面大小_IFIX优化_画面设计.pdf
  19. [电子设计大赛]射频宽带放大器设计报告
  20. 程序人生路(四)学会时间管理并做好读书学习,这样才能成为职场中常胜将军

热门文章

  1. 电脑启动后显示器黑屏怎么办?排查下面4个问题,快速解决
  2. Netty框架基本介绍
  3. PHP 四种基础算法
  4. 电脑CPU温度过高怎么解决呢?怎么才能监测电脑CPU温度?
  5. 时间序列(time serie)分析系列之时间序列特征(feature)7
  6. Configuration类详解
  7. 动态链接库dll(Windows/C++)
  8. jpa分页查询(PageRequest对象)相关函数
  9. 教你炒股票94:当机立断
  10. 树莓派小车的4G遥控与视频回传(内网穿透)