leetcode:59.螺旋矩阵II

简介: leetcode:59.螺旋矩阵II

题目描述:


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


示例:


输入: 3
输出:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]


题目难度:中等


分析:

和前面的54.螺旋矩阵I同样的道理,还是模拟路径,首先绘制出一个n*n的矩阵,然后顺时针按照从左到右,从上到下,从右到左,从下到上的方向依次去走,然后把每次应该填入的数字填入即可。代码如下:


java:


class Solution {
    public int[][] generateMatrix(int n) {
      // 定义一个二维数组
        int[][] res = new int[n][n];
        // 数字从1开始,最大值也就是方格数
        int currentNum = 1, maxNum = n * n;
        // 定义边界,边界就是下标的最大值,用来控制方向,转弯
        // 首先是左边,按照顺时针理解,从左到右为正方向,所以初始值是0
        // 从右到左就是反方向,所以右边界是n - 1,上下边界同理
        int left = 0, top = 0, right = n - 1, back = n - 1;
        while (currentNum <= maxNum) {
          // 从左到右
            for (int i = left; i <= right; i++) {
              // 填入的值按照二维数组的下标表示的话依次是[0][0],[0][1],[0][2]...
              // 由此可见上边界top是不变的
                res[top][i] = currentNum++;
            }
            // 走完一次top,那么top边界应该改变,顺时针就是+1
            top++;
            // 另外3条边同理,以此类推即可
            for (int i = top; i <= back; i++) {
                res[i][right] = currentNum++;
            }
            right--;
            for (int i = right; i >= left; i--) {
                res[back][i] = currentNum++;
            }
            back--;
            for (int i = back; i >= top; i--) {
                res[i][left] = currentNum++;
            }
            left++;
        } 
        return res;
    }
}


python:


要注意二维数组的创建方式,不能用res = [[0] * n] * n这种方式。否则当 [0][0]改变,[1][0]也会改变。


class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        res = [[0] * n for i in range(n)]
        current_num, max_num = 1, n * n
        left, top, right, back = 0, 0, n - 1, n - 1
        while current_num <= max_num:
            for i in range(left, right + 1):
                res[top][i] = current_num
                current_num += 1
            top += 1
            for i in range(top, back + 1):
                res[i][right] = current_num
                current_num += 1
            right -= 1
            for i in range(right, left - 1, -1):
                res[back][i] = current_num
                current_num += 1
            back -= 1
            for i in range(back, top - 1, -1):
                res[i][left] = current_num
                current_num += 1
            left += 1
        return res


总结:


时间复杂度为O(n 2 ),此方法是54.螺旋矩阵I的改良方法,不需要去判断当前方向,较为简单,多看几遍即可理解。

目录
相关文章
|
10月前
【Leetcode -2181.合并零之间的节点- 2326.螺旋矩阵Ⅳ】
【Leetcode -2181.合并零之间的节点- 2326.螺旋矩阵Ⅳ】
60 0
|
4天前
|
算法
LeetCode第59题螺旋矩阵 II
LeetCode第59题"螺旋矩阵 II"的解题方法,通过模拟螺旋填充过程,一圈一圈从外到内按顺序填充数字,直到完成整个矩阵的构建。
LeetCode第59题螺旋矩阵 II
|
4天前
|
存储 算法
LeetCode第54题螺旋矩阵
LeetCode第54题"螺旋矩阵"的解题方法,通过模拟从外到内的螺旋遍历过程,并利用方向向量控制遍历方向的转换,有效输出矩阵的螺旋顺序。
LeetCode第54题螺旋矩阵
|
2月前
leetcode54螺旋矩阵题解
leetcode54螺旋矩阵题解
21 2
|
2月前
|
算法 机器人 数据挖掘
LeetCode题目54:螺旋矩阵【python4种算法实现】
LeetCode题目54:螺旋矩阵【python4种算法实现】
|
2月前
|
存储 算法
力扣经典150题第三十五题:螺旋矩阵
力扣经典150题第三十五题:螺旋矩阵
10 0
|
10月前
|
机器学习/深度学习 算法
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
47 0
|
3月前
leetcode-6111:螺旋矩阵 IV
leetcode-6111:螺旋矩阵 IV
32 0
|
3月前
|
Java C++ Python
leetcode-59:螺旋矩阵 II
leetcode-59:螺旋矩阵 II
26 0
|
3月前
leetcode-54:螺旋矩阵
leetcode-54:螺旋矩阵
29 0