[leetCode]59. 螺旋矩阵 II

在这里插入图片描述

模拟


模拟顺时针画矩阵过程

  • 填充上行,从左到右
  • 填充右列,从上到下
  • 填充下行,从右到左
  • 填充左列,从下到上

画一圈需要画四条边,需要注意的是每画一条边都需要遵循「左闭右开」原则
,也就是说每一条边的画法要相同,不然代码会越写越乱。
下面按照左闭右开原则画一圈:

在这里插入图片描述
每一种颜色代表一条边,在拐角处画新的边。

class Solution {
    public int[][] generateMatrix(int n) {
        // 定义一个二维数组
        int[][] ans = new int[n][n];
        // 定义每循环一个圈的起始位置
        int startX = 0, startY = 0;
        // 每个圈循环几次
        int loop = n/2;
        // 矩阵中间位置
        int mid = n/2;
        // 用来给矩阵中每一个空格赋值
        int count = 1;
        // 每循环一圈需要控制每一条边的遍历长度
        int offset = 1;
        int i, j;
        while (loop-- > 0) {
            // 模拟填充上行,从左到右(左闭右开)
            for (j = startY; j < startY + n - offset; j++) {
                ans[startX][j] = count++;
            }
            for (i = startX; i < startX + n - offset; i++) {
                ans[i][j] = count++;
            }
            for (; j > startY; j--) {
                ans[i][j] = count++;
            }
            for (; i > startX; i--) {
                ans[i][j] = count++;
            }

            // 第二圈开始后起始位置各自加1
            startX++;
            startY++;

            // 控制每一条边的遍历长度
            offset+=2;
        }

        // 如果n为奇数,则需要单独为中间位置赋值
        if (n % 2 != 0) {
            ans[mid][mid] = count;
        }
        return ans;
    }
}
posted @ 2020-10-23 16:25  消灭猕猴桃  阅读(66)  评论(0编辑  收藏  举报