leetcode:59.螺旋矩阵II

题目描述:

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

示例:
输入: 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 n^2 n2),此方法是54.螺旋矩阵I的改良方法,不需要去判断当前方向,较为简单,多看几遍即可理解。

你可能感兴趣的:(leetcode,leetcode,算法)