螺旋矩阵【史上最详细解释】

解题思路:\

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

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值