Spiral Matrix II

Spiral Matrix II

问题:

Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

思路:

  矩阵的旋转常用模板

我的代码1:

public class Solution {
    public int[][] generateMatrix(int n) {
        if(n < 0) return null;
        int[][] rst = new int[n][n];
        int num = 1;
        for(int i = 0; i < n / 2; i++)
        {
            //left to right
            for(int k = i; k < n - 1 - i; k++)
            {
                rst[i][k] = num;
                num++;
            }
            //right to down
            for(int k = i; k < n - 1 - i; k++)
            {
                rst[k][n - i - 1] = num;
                num++;
            }
            //down to left
            for(int k = i; k < n - 1 - i; k++)
            {
                rst[n - i - 1][n - k - 1] = num;
                num++;
            }
            //left to top
            for(int k = i; k < n - 1 - i; k++)
            {
                rst[n - k - 1][i] = num;
                num++;
            }
        }
        if( n % 2 != 0)
            rst[n/2][n/2] = num;
        return rst;
    }
}
View Code

我的代码2:

public class Solution {
    public int[][] generateMatrix(int n) {
        if(n < 0) return null;
        int[][] rst = new int[n][n];
        int num = 1;
        int row = n;
        int x1 = 0, y1 = 0;
        while(row > 0)
        {
            int x2 = x1 + row - 1;
            int y2 = y1 + row - 1;
            //left to right
            for(int i = y1; i <= y2; i++)
            {
                rst[x1][i] = num++;
            }
            //right to down
            for(int i = x1 + 1; i < x2; i++)
            {
                rst[i][y2] = num++;
            }
            if(row == 1)    break;
            //down to left
            for(int i = y2; i >= y1; i--)
            {
                rst[x2][i] = num++;
            }
            //left to top
            for(int i = x2 - 1; i > x1; i--)
            {
                rst[i][y1] = num++;
            }
            row -= 2;
            x1 ++;
            y1 ++;
        }
        return rst;
    }
}
View Code

学习之处:

  • 矩阵的旋转标准模式:模式为每一行或者每一列(n)只操作 n-1,这样firstrow,rightcol,lastrow,leftcol便能组成一圈,此种方法对于n为奇数不敏感,详见Roate Image。
  • 若将矩阵旋转方法应用于矩阵赋值,出现当n为奇数时,判断很复杂,如n = 1 n-1=0 此时变无法赋值了,换句话说,如果要操作所有的对象,最后需加入判断matrix[n/2][n/2]处,详见我的代码1
  • 为了防止奇数时的复杂判断,所以采用另外一种标准模式,对于行访问全行数据,数据量为row,对于列访问中间列的数据,也就是colNum - 2的数据量,详见我的代码2。通过确定左上角和右下角坐标的方法,代码还不容易出错,一个好方法。

原文地址:https://www.cnblogs.com/sunshisonghit/p/4320875.html