LeetCode:Spiral Matrix I II

本文介绍如何生成螺旋矩阵及按螺旋顺序遍历矩阵的方法。包括两个主要问题:一是按螺旋顺序返回矩阵的所有元素;二是生成指定大小的螺旋矩阵。
Spiral Matrix

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

For example, 
Given the following matrix:

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

You should return [1,2,3,6,9,8,7,4,5].

 

打印螺旋矩阵

逐个环的打印, 对于m *n的矩阵,环的个数是 (min(n,m)+1) / 2。对于每个环顺时针打印四条边。

注意的是:最后一个环可能只包含一行或者一列数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class  Solution {
public :
     vector< int > spiralOrder(vector<vector< int > > &matrix) {
         int  m = matrix.size(), n;
         if (m != 0)n = matrix[0].size();
         int  cycle = m > n ? (n+1)/2 : (m+1)/2; //环的数目
         vector< int >res;
         
         int  a = n, b = m; //a,b分别为当前环的宽度、高度
         for ( int  i = 0; i < cycle; i++, a -= 2, b -= 2)
         {
             //每个环的左上角起点是matrix[i][i],下面顺时针依次打印环的四条边
             for ( int  column = i; column < i+a; column++)
                 res.push_back(matrix[i][column]);
             for ( int  row = i+1; row < i+b; row++)
                 res.push_back(matrix[row][i+a-1]);
             if (a == 1 || b == 1) break ; //最后一个环只有一行或者一列
             for ( int  column = i+a-2; column >= i; column--)
                 res.push_back(matrix[i+b-1][column]);
             for ( int  row = i+b-2; row > i; row--)
                 res.push_back(matrix[row][i]);
         }
         return  res;
     }
};

 


Spiral Matrix II

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

For example, 
Given n = 3,

You should return the following matrix:

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

本质上和上一题是一样的,这里我们要用数字螺旋的去填充矩阵。同理,我们也是逐个环的填充,每个环顺时针逐条边填充                 本文地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class  Solution {
public :
     vector<vector< int > > generateMatrix( int  n) {
         vector<vector< int > > matrix(n, vector< int >(n));
         int  a = n; //a为当前环的边长
         int  val = 1;
         for ( int  i = 0; i < n/2; i++, a -= 2)
         {
             //每个环的左上角起点是matrix[i][i],下面顺时针依次填充环的四条边
             for ( int  column = i; column < i+a; column++)
                 matrix[i][column] = val++;
             for ( int  row = i+1; row < i+a; row++)
                 matrix[row][i+a-1] = val++;
             for ( int  column = i+a-2; column >= i; column--)
                 matrix[i+a-1][column] = val++;
             for ( int  row = i+a-2; row > i; row--)
                 matrix[row][i] = val++;
         }
         if (n % 2)matrix[n/2][n/2] = val; //n是奇数时,最后一个环只有一个数字
         return  matrix;
     }
};

 






本文转自tenos博客园博客,原文链接:http://www.cnblogs.com/TenosDoIt/p/3774747.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值