zoukankan      html  css  js  c++  java
  • [Leetcode] spiral matrix ii 螺旋矩阵

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

    For example,
    Given n =3,

    You should return the following matrix:

    [
     [ 1, 2, 3 ],
     [ 8, 9, 4 ],
     [ 7, 6, 5 ]
    ]

    题意:给定整数n,以螺旋的方式形成一个n×n个矩阵。

    思路:这题的思路和spiral matrix 一样。还是按照螺旋的方式去赋值,由外到内的一层层赋值。这两题的区别在于,本题中,不可能剩下1×k或者k×1的区域没有赋值,因为这个是一个正方形,所以在讨论最初和最后情况时,只需要一个if条件判断即可。还有一点要注意的是,返回值一定要先赋值,不然用下标访问不存在的地方会报错。代码如下:

     1 class Solution {
     2 public:
     3     vector<vector<int> > generateMatrix(int n) 
     4     {
     5         vector<vector<int>> matrix(n,vector<int>(n,0));
     6         if(n==0)    return matrix;
     7 
     8         int left=0,right=n-1;
     9         int up=0,down=n-1;
    10         int num=1;
    11         
    12         while(right>=left && down>=up)
    13         {
    14             if(right==left)
    15             {
    16                 matrix[up][right]=num;
    17                 return matrix;
    18             }
    19             
    20             for(int i=left;i<right;++i)
    21             {
    22                 matrix[up][i]=num;
    23                 num++;
    24             }
    25             for(int i=up;i<down;++i)
    26             {
    27                 matrix[i][right]=num;
    28                 num++;
    29             }
    30             for(int i=right;i>left;i--)
    31             {
    32                 matrix[down][i]=num;
    33                 num++;
    34             }
    35             for(int i=down;i>up;i--)
    36             {
    37                 matrix[i][left]=num;
    38                 num++;
    39             }
    40 
    41             left++;
    42             right--;
    43             up++;
    44             down--;
    45         }
    46         return matrix;
    47 
    48     }
    49 };

    方法二:也可以使用旋转图片中的思想,只不过比较难想一些。代码如下:

     1 class Solution
     2 {
     3 public:
     4     vector<vector<int>> generateMatrix(int n)
     5     {
     6         vector<vector<int>> matrix(n,vector<int>(n,0));       //一定要给matrix给赋值。
     7        // 由外层到里,一层考虑
     8         if(n==1)
     9         {
    10             matrix[0][0]=1;
    11             return matrix;
    12         }
    13         int temp=1;
    14         //层数
    15         for(int layer=0;layer<n/2;++layer)
    16         {
    17             int first=layer;
    18             int last=n-1-layer;
    19             int num=last-first;
    20             //每一层上,每一行、列,找出相应规律,都从顶点赋值
    21             for(int i=first;i<last;++i)
    22             {
    23                 int offset=i-first;
    24                 matrix[first][i]=temp+i;
    25                 matrix[i][last]=temp+num+i;
    26                 matrix[last][last-offset]=temp+2*num+i;
    27                 matrix[last-offset][first]=temp+3*num+i;
    28             }
    29             temp+=4*num-1;
    30         }
    31         //当n为奇数时,最中心的一个为n^2
    32         if(n%2==1)  matrix[n/2][n/2]=n*n;
    33         return matrix;
    34     }
    35 };
  • 相关阅读:
    SQLite-SQLiteDatabase 数据库实例练习
    全局配置一个ajax的错误监控
    文件上传&&验证文件格式
    CSS3 resize 属性
    select change()
    window.location.Reload()和window.location.href 区别
    条件检索
    jQuery $.ajax传递数组的traditional参数传递必须true 对象的序列化
    jquery中attr方法和prop方法的区别
    resize
  • 原文地址:https://www.cnblogs.com/love-yh/p/7101549.html
Copyright © 2011-2022 走看看