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

  • 相关阅读:
    lua -- encode and decode
    lua二进制操作函数
    linux C++多线程使用pthread_cond 条件变量
    linux c 多线程编程--互斥锁与条件变量
    linux C--多线程基本概念及API函数
    linux C多线程编程
    2.5 linux C 进程与多线程入门--(5)使用互斥量进行同步
    linux C多线程编程入门(基本API及多线程的同步与互斥)
    2.4 linux C 进程与多线程入门--(4)简单多线程程序
    2.3 linux C 进程与多线程入门--(3)信号
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4320875.html
Copyright © 2020-2023  润新知