ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Leetcode 59. 螺旋矩阵(Spiral Matrix II)

2019-09-21 16:02:19  阅读:258  来源: 互联网

标签:elif 12 59 Matrix 迭代 位置 Spiral flag 13


这是我的第一篇博客,先随便写写,后续会补充更多内容。

注:本文表示数组位置(index)都是从下标为0开始。

题目描述:

给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

解法:

这道题的重点在于找到数组相应位置(index)迭代的关系,观察下面这个例子:

用 i 表示行, j 表示列, n 表示总行数(列数)

[
 [   1,    2,  3, 4 ],
 [ 12, 13, 14, 5 ],
 [ 11, 16, 15, 6 ],
[ 10, 9, 8, 7 ],
]

从第一行第一个位置(0, 0)到(0, 3),各个位置的行数一致,列数在不断增加;
当第一行被填满时,剩下的数字会从最后一列第一个位置(0,3)开始往下存放数字,直到到达最后一个位置(3, 3)。
在这个过程中,列数是不变的,行数一直在增加,直到到达位置(3, 3);接下来类似,从位置(3, 3)到位置(3, 0),
行数不变而列数在减少;最后在位置(3, 3)到位置(1, 0),列数不变而行数减少。
可以发现1-12迭代的过程和13-16迭代的过程是类似的,都是从头开始一直迭代到初始位置的下方。
[
 [  1,  2,  3,  4 ],
 [ 12,           5 ],
 [ 11,           6 ],
[ 10, 9, 8, 7 ],
]
[
 [ 13, 14 ],
 [ 16, 15 ],
]

将1-12迭代过程中发生变化的四个临界点找出(用代数式表示):
(0, n-1), (n-1, n-1), (n-1, 0), (1, 0)
13-16迭代的临界点:
(1, n-2), (n-2, n-2), (n-2, 1), (2, 1)
容易找到下面这个关系:
h = 0;
(0, n-h-1), (n-h-1, n-h-1), (n-h-1, 0), (h+1, h)
当到达点(h+1, h)时,h++(因为要从内部开始新一轮迭代),并且i,j的递增模式应该恢复到原始状态,即i不变,j递增。
能想到这后面的代码就很容易了,只需要迭代生成n*n个数字,分别存储到相应的数组位置上就可以了。
下面给出Python实现的代码:

def generateMatrix(n):
    res = [[0 for i in range(n)] for i in range(n)]
    i, j, flag = 0, 0, 0
    h = 0
    for k in range(1, n*n+1):
        if j == n-h-1 and i == h: 
            flag = 1
        elif i == n-h-1 and j == n-h-1:
            flag = 2
        elif i == n-h-1 and j == h:
            flag = 3
        elif i == h+1 and j == h:
            h += 1
            flag = 0
        res[i][j] = k
        if flag == 0: 
            j += 1
        elif flag == 1:
            i += 1
        elif flag == 2:
            j -= 1
        elif flag == 3:
            i -= 1
    return res

 

标签:elif,12,59,Matrix,迭代,位置,Spiral,flag,13
来源: https://www.cnblogs.com/Alevals/p/11563398.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有