zoukankan      html  css  js  c++  java
  • 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。通过确定左上角和右下角坐标的方法,代码还不容易出错,一个好方法。

  • 相关阅读:
    python内置模块argparse的使用
    pyqt5中通过pycharm配置designer(win和mac都适用,修改下designer目录路径即可)
    初始pyqt5
    pyqt5学习示例
    python中partial用法
    python中操作csv
    python模块imghdr-----推测图像类型
    portainer docker可视化工具
    靠着这份面试手册成功斩获99家BAT大厂offer
    redis事物有一致性吗?
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4320875.html
Copyright © 2011-2022 走看看