leetcode 59. 螺旋矩阵 II

题目描述

给定一个正整数,生成一个包含到所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
相关话题: 数组    难度: 中等

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

思路:
和螺旋打印二位数组思路一样,采用一种宏观的思想逐层螺旋式地给二维数组赋值,

leetcode 59. 螺旋矩阵 II_第1张图片

  • 首先,矩阵左上角的位置trtc,右下角位置brbc
  • 核心思想是通过顺时针的方式逐层赋值,依次为
    1. tr不变,i : tc -> bc - 1,做循环for(int i = tc;i <= bc - 1;i++)
    2. bc不变,i : tr -> br - 1,做循环for(int i = tr;i <= br - 1;i++)
    3. br不变,i : bc -> tc + 1,做循环for(int i = bc;i >= tc + 1;i--)
    4. tc不变,i : br -> tr + 1,做循环for(int i = br;i >= tr + 1;i--)

以上四个循环做完,就给一层赋了值,然后tr++,tc++,br--,bc--,给内一层赋值,直到tr <= br
需要注意的一个边界条件tr==br,当n为奇数时

leetcode 59. 螺旋矩阵 II_第2张图片

最后中间只剩一个元素需要赋值,此时 tr==br, tc == bc,以上四个循环都无法进入,所以要对 tr == br做边界处理。

class Solution {
    public int[][] generateMatrix(int n) {
        int tr = 0, tc = 0;
        int br = n - 1, bc = n - 1;
        int[][] matrix = new int[n][n];
        int count = 0;
        while(tr <= br){
            if(tr == br){
                matrix[tr][tc] = ++count;
            }else{
                for(int i = tc;i <= bc - 1;i++){
                    matrix[tr][i] = ++count;
                }
                for(int i = tr;i <= br - 1;i++){
                    matrix[i][bc] = ++count;
                }
                for(int i = bc;i >= tc + 1;i--){
                    matrix[br][i] = ++count;
                }
                for(int i = br;i >= tr + 1;i--){
                    matrix[i][tc] = ++count;
                }
            }
            tr++;
            tc++;
            br--;
            bc--;
        }
        return matrix;
    }
}

你可能感兴趣的:(leetcode 59. 螺旋矩阵 II)