59. Spiral Matrix II

来源:互联网 发布:数据分析师有前景嘛 编辑:程序博客网 时间:2024/06/13 23:45

题目:Spiral Matrix II

原题链接: https://leetcode.com/problems/spiral-matrix-ii/
Given an integer n, generate a square matrix filled with elements from 1 to n * n 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 的螺旋矩阵。
例如n == 3,返回如下:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]

模拟它的产生过程就行。
设i ,j ,up,down,left,right,cnt,其中 i 和 j 表示需要填充位置的下标(i,j),up和down分别表示当前填充范围的上界和下界,left和right则表示左边界和右边界,初始i = j = 0, up = left = 0,down = right = n - 1,cnt 表示当前要填充的数字,初始为1。
由于螺旋矩阵的构造是按照一个螺旋的顺序填充1,2,3,4,5。。。(可以参照样例的矩阵想象这种填充顺序),我们要做的就是模拟这个填充的顺序,每一次把矩阵的外围一圈填满,然后再往内一圈,再往内。。。一直到填充完毕。
四条边的顺序是按照上边,右边,下边,左边的顺序填充,所以分别会有4个循环:
第一个循环:上边
每次填充 i 不变 ,j 递增至边界,即:ans[ i ][ j++] = cnt++;一直到 j == right为止。
调整 i ,j 到下一个待填充的位置,让 i 加1,j 减一;
第二个循环:右边
每次填充 j 不变,i 递增至边界,即:ans[ i++ ][ j ] = cnt++;一直到 i == down为止 。
调整 i ,j 到下一个待填充的位置,让 i 减1,j 减一;
第三个循环:下边
每次填充 i 不变,j 递减到边界,即:ans[ i ][ j– ] = cnt++;一直到 j == left 为止。
调整 i ,j 到下一个待填充的位置,让 i 减1,j 加一;
第四个循环:左边
每次填充 j 不变,i 递减至边界的下一位,即:ans[ i– ][ j ] = cnt++;一直到 i == up + 1为止。
调整 i ,j 到下一个待填充的位置,让 i 加1,j 加一;
此时外围一圈填充结束,开始填充内圈,调整边界大小,即up加一,down减一,left加一,right减一。
重复上述循环,一直到 cnt 超过n * n 为止。

代码如下:

class Solution {public:    vector<vector<int>> generateMatrix(int n) {        vector<vector<int> > ans(n, vector<int>(n));        int i = 0, j = 0, cnt = 1, up = 0, down = n - 1, left = 0, right = n - 1;        while(cnt <= n * n) {            while(j <= right && cnt <= n * n) ans[i][j++] = cnt++;            j--;i++;            while(i <= down && cnt <= n * n) ans[i++][j] = cnt++;            i--;j--;            while(j >= left && cnt <= n * n) ans[i][j--] = cnt++;            i--;j++;            while(i > up && cnt <= n * n) ans[i--][j] = cnt++;            i++;j++;            up++;down--;left++;right--;        }        return ans;    }};
0 0
原创粉丝点击