LeetCode:885. Spiral Matrix III - Python

问题描述:

885. 螺旋矩阵 III

RC 列的矩阵上,我们从 (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))

声明: 总结学习,有问题可以批评指正,大神可以略过哦。

猜你喜欢

转载自blog.csdn.net/XX_123_1_RJ/article/details/81952905