day3-螺旋矩阵 II

螺旋矩阵 II

题目链接

题目描述

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

示例 1:

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:

输入:n = 1
输出:[[1]]

思路

这道题需要一点构思,我们要做的是模拟这个顺时针的行为,而且我们只需要实现一次循环即可。

确定我们的思路是:先实现一次顺时针循环。

很简单,代码如下:

//从左到右
int i=0, j=0;
for(;j< len;j++)
{
    res[i][j] = val++;
}
//从上到下
for(;i<len;i++)
{
    res[i][j] = val++;
}
//从右到左
for(;j>0;j--)
{
    res[i][j] = val++;
}
//从下到上
for(;i>0;i--)
{
    res[i][j] = val++;
}

到此为止我们可以实现一次循环,但是这只能算一次循环,我们还需加入一些变量使得可以不断循环。

我们要考虑以下问题:

  • 要循环几次?
  • 每一次for循环的长度是多少?
  • 坐标的起点怎么设置?
  • 奇数偶数如何处理?

循环次数会等于 n/2,这个结论自己随便证明一下就出来了,于是我们得到loop = n/2

循环长度,这里我们要考虑,每次循环时是左闭右闭还是左闭右开,如果选择左闭右闭,必然会有几个点是重叠的,需要考虑val值–的问题,所以选择左闭右开是比较简单的!举个例子:n=4的矩阵,第一次遍历[1,2,3] [4,5,6] [7,8,9] [10,11,12],可以看出来长度为3,第二次遍历长度便为2(可自己推一下)。我们可以得出结论,循环长度 = len = n - offset,offset每次循环+1.

起点设置,第一次必定为(0,0),第二次为(1,1)(如果有),可知每次循环双双+1即可。

奇数偶数,如果n为奇数,那么遍历到最后必定有一个坐标没有赋值到,此时需要手动赋值 res[mid] [mid] = val

因此,我们可以写出以下代码:

代码

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n,vector<int>(n,0));
        int loop = n/2;
        int val = 1;
        int offset = 1;
        int start_x = 0,start_y = 0;
        int i,j;
        while(loop--)
        {
            i = start_x;
            j = start_y;
            //从左到右
            for(;j <n-offset; j++)
            {
                res[i][j] = val++;
            }
            //从上到下
            for(;i <n-offset; i++)
            {
                res[i][j] = val++;
            }
            //从右到左
            for(;j > start_y;j--)
            {
                res[i][j] = val++;
            }
            //从下到上
            for(;i > start_x;i--)
            {
                res[i][j] = val++;
            }

            start_x++;
            start_y++;
            offset++;

        }
        if(n%2 !=0)
        {
            res[n/2][n/2] = val;
        }
        return res;
    }

};

你可能感兴趣的:(算法,矩阵)