问题描述:
在R
行C
列的矩阵上,我们从 (r0, c0)
面朝东面开始
这里,网格的西北角位于第一行第一列,网格的东南角位于最后一行最后一列。
现在,我们以顺时针按螺旋状行走,访问此网格中的每个位置。
每当我们移动到网格的边界之外时,我们会继续在网格之外行走(但稍后可能会返回到网格边界)。
最终,我们到过网格的所有R * C
个空间。
按照访问顺序返回表示网格位置的坐标列表。
示例 1:
输入:R = 5, C = 6, r0 = 1, c0 = 4
输出:[[1,4],[1,5],[2,5],[2,4],[2,3],[1,3],[0,3],[0,4],[0,5],[3,5],[3,4],[3,3],[3,2],[2,2],[1,2],[0,2],[4,5],[4,4],[4,3],[4,2],[4,1],[3,1],[2,1],[1,1],[0,1],[4,0],[3,0],[2,0],[1,0],[0,0]]
问题分析:
这题目,可以这样简单解决,不管什么二维数组是多大的,我就每次走一个螺旋,但是在添加路径的时候,判断当前位置是否出界,如果出界,就不往路径里面添加,这样的好处是代码非常简单的实现,缺是点要走很多不必要的路径,可以使用剪枝的方法来处理。在走螺旋的时候,其实是找规律1、1、2、2、3、3(左、下、右、上、左、下、右、上….)
Python3实现:
代码参考官方:leetcode.com/problems/spiral-matrix-iii/solution/ (给人的感觉是很清晰,但是效率不高,可以剪枝改进)
class Solution:
def spiralMatrixIII(self, R, C, r0, c0):
res = [[r0, c0]]
if R * C == 1: return res
for k in range(1, 2*(R+C), 2): # k 表示每个边的长度
for dr, dc, dk in ((0, 1, k), (1, 0, k), (0, -1, k+1), (-1, 0, k+1)): # 左、下、右、上 (四个方向移动)
for _ in range(dk):
r0 += dr
c0 += dc
if 0 <= r0 < R and 0 <= c0 < C: # 判断是否出界
res.append([r0, c0]) # 添加路径
if len(res) == R * C: # 够长了,说明已经走完
return res
if __name__ == '__main__':
R, C, r0, c0 = 5, 6, 1, 4
solu = Solution()
print(solu.spiralMatrixIII(R, C, r0, c0))
声明: 总结学习,有问题可以批评指正,大神可以略过哦。