目 录CONTENT

文章目录

Leecode 59.螺旋矩阵II(画图分析)

小王同学
2024-04-30 / 0 评论 / 0 点赞 / 54 阅读 / 0 字

Leecode 59.螺旋矩阵II(画图分析)

力扣传送门(opens new window)

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

示例:

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

解题思路:

  • 初始化一个 n×n 大小的矩阵result ,然后模拟整个向内环绕的填入过程:
  • 定义当前左右上下边界 left,top,right,bottom,初始值 currNum = 0
  • 首先从左到右遍历,到右边界后,下面我们需要从下一行开始从上到下遍历,所以需要控制上边界,top++;
  • 接着从上到下遍历,到下边界后,我们需要从左边的一列开始从右到左遍历,所以需要控制右边界, right--;
  • 接着从右到左遍历,到左边界后,我们需要从上边的一行开始从下到上遍历,所以需要控制下边界,bottom--;
  • 最后我们需要从上到下遍历,到上边界后,需要从右边的下一列开始从左到右开始遍历,所以需要控制左边界,left++;

重复以上操作,最后我们需要判断左边界是否大于右边界,下边界是否大于上边界

满足这两个条件,说明我们已经遍历完成,直接返回结果即可。

86c8bb7f1763bf63deaafcd13456868.jpg

代码实现:

java

class Solution {
    public int[][] generateMatrix(int n) {
        int left = 0; // 左边界
        int top = 0; // 上边界
        int right = n - 1; // 右边界
        int bottom = n - 1; // 下边界
        int currNum = 0; // 当前填充的数字
        int[][] result = new int[n][n]; // 结果矩阵
        while(true){
            // 从左到右填充数字
            for(int i = left; i <= right; i++){
                result[top][i] = ++currNum;
            }
            top++;
            // 从上到下填充数字
            for(int i = top; i <= bottom; i++){
                result[i][right] = ++currNum;
            }
            right--;
            // 从右到左填充数字
            for(int i = right; i >= left; i--){
                result[bottom][i] = ++currNum;
            }
            bottom--;
            // 从下到上填充数字
            for(int i = bottom; i >= top; i--){
                result[i][left] = ++currNum;
            }
            left++;
            // 判断是否完成遍历
            if(left > right || top > bottom){
                break;
            }
        }
        return result;
    }
}

python

class Solution:
    def generateMatrix(self, n: int) -> list[list[int]]:
        left, top = 0, 0  # 左边界和上边界
        right, bottom = n - 1, n - 1  # 右边界和下边界
        curr_num = 0  # 当前填充的数字
        result = [[0] * n for _ in range(n)]  # 结果矩阵

        while True:
            # 从左到右填充数字
            for i in range(left, right + 1):
                curr_num += 1
                result[top][i] = curr_num
            top += 1

            # 从上到下填充数字
            for i in range(top, bottom + 1):
                curr_num += 1
                result[i][right] = curr_num
            right -= 1

            # 从右到左填充数字
            for i in range(right, left - 1, -1):
                curr_num += 1
                result[bottom][i] = curr_num
            bottom -= 1

            # 从下到上填充数字
            for i in range(bottom, top - 1, -1):
                curr_num += 1
                result[i][left] = curr_num
            left += 1

            # 判断是否完成遍历
            if left > right or top > bottom:
                break

        return result

c++

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int left = 0, top = 0;  // 左边界和上边界
        int right = n - 1, bottom = n - 1;  // 右边界和下边界
        int currNum = 0;  // 当前填充的数字
        vector<vector<int>> result(n, vector<int>(n, 0));  // 结果矩阵

        while (true) {
            // 从左到右填充数字
            for (int i = left; i <= right; i++) {
                result[top][i] = ++currNum;
            }
            top++;

            // 从上到下填充数字
            for (int i = top; i <= bottom; i++) {
                result[i][right] = ++currNum;
            }
            right--;

            // 从右到左填充数字
            for (int i = right; i >= left; i--) {
                result[bottom][i] = ++currNum;
            }
            bottom--;

            // 从下到上填充数字
            for (int i = bottom; i >= top; i--) {
                result[i][left] = ++currNum;
            }
            left++;

            // 判断是否完成遍历
            if (left > right || top > bottom) {
                break;
            }
        }

        return result;
    }
};

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区