leetcode-螺旋矩阵(59)

134 阅读2分钟

题目

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix [59. 螺旋矩阵 II](leetcode.cn/problems/sp…)

示例 1:

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

思路

这道题目没有什么特殊的技巧,按照顺时针的方式填充矩阵的数据。顺时针分为四条边,我们需要挨个处理这四个边。在每一轮循环中,我们按照从左往右、从上往下、从右往左、从下往上的顺序依次填充矩阵的每一行或每一列。

变量定义

  • rowStart。用于记录每一次顺时针开始时,矩阵行开始的地方。
  • rowEnd。用于记录每一次顺时针开始时,矩阵行结束的地方。
  • colStart。用于记录每一次顺时针开始时,矩阵列开始的地方。
  • colEnd。用于记录每一次顺时针开始时,矩阵列结束的地方。
  • count。用于记录填充的数据。

处理细节

  • 从左往右,不变的是rowStart(行),变动的是列。在for循环中完成填充之后为下一次的从上往下准备rowStart++;
  • 从上往下,不变的是colEnd(列),变动的是行。在for循环中完成填充之后为下一次的从右往左准备colEnd--;
  • 从右往左,不变的是rowEnd(行),变动的是列。在for循环中完成填充之后为下一次的从下往上准备rowEnd--;
  • 从下往上,不变的是colStart(列),变动的是行。在for循环中完成填充之后为下一次的从上往下准备colStart++;

代码

package leetcode;


public class GenerateMatrix59 {
    public static void main(String[] args) {
        int[][] arr = generateMatrix(3);
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
    }
    public static int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];
        int rowStart = 0;
        int rowEnd = n - 1;
        int colStart = 0;
        int colEnd = n - 1;
        int count = 1;
        while (rowStart <= rowEnd && colStart <= colEnd) {
            //从左往右
            for (int i = colStart; i <= colEnd; i++) {
                res[rowStart][i] = count++;
            }
            rowStart++;
            //从上往下
            for (int i = rowStart; i <= rowEnd; i++) {
                res[i][colEnd] = count++;
            }
            colEnd--;
            //从右往左
            for (int i = colEnd; i >= colStart; i--) {
                res[rowEnd][i] = count++;
            }
            rowEnd--;
            //从下往上
            for (int i = rowEnd; i >= rowStart; i--) {
                res[i][colStart] = count++;
            }
            colStart++;
        }
        return res;
    }
}