螺旋矩阵

螺旋矩阵

题意

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

img

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

示例 2:

img

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

提示:

m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix

题解

这是一道模拟题。

    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> num;
        int l=0;
        int r=m-1;
        int t=0;
        int b=n-1;
    }

根据题意给定一个矩阵,将其顺时针遍历,将遍历的元素放在一个数组中返回。

根据图像可以发现每转一圈都会往里缩进一层。那么我们可以给四个边界赋个初值。

l=0,r=m-1,t=0,b=n-1;

可以得出式子

for(int i=l;i<=r&&t<=b;i++)//从左到右
{
    num.push_back(matrix[t][i]);//因为是顺时针,所以一定是在t行上从左到右遍历。
}
t++;//到右边界了,那么就要开始从上到下了,缩进一层,从t+1行开始.
for(int i=t;i<=b&&l<=r;i++)//从上到下
{
    num.push_back(matrix[i][r]);//因为是顺时针,所以此时一定在右边界上,所以从上到下是在r列
}
r--;//到下边界了,要开始从右到左了,缩进一层,从r-1列开始.
for(int i=r;i>=l&&t<=b;i--)//从右到左
{
    num.push_back(matrix[b][i]);//因为是顺时针,所以此时是在下边界上,所以是在b行
}
b--;//到左边界了,要开始从下到上了,缩进一层,从b-1行开始.
for(int i=b;i>=t&&l<=r;i--)//从下到上
{
    num.push_back(matrix[i][l]);//因为是顺时针,所以此时是在左边界上,所以是在l列
}
l++;//缩进一层,从l+1列开始从左到右

以上4个循环一趟就是一圈,无限循环直到到达边界,那么就将矩阵内所有的元素放入了数组当中。

边界为当lr且tb时,那么就是已经到达最中心的点了,随即退出,返回数组。

参考代码

vector<int> spiralOrder(vector<vector<int>>& matrix) 
{
    vector<int> num;
    int n=matrix.size();
    int m=matrix[0].size();
    int l=0;
    int r=m-1;
    int t=0;
    int b=n-1;
    while(l<=r&&t<=b)
    {
        for(int i=l;i<=r&&t<=b;i++)//从左到右
        {
            num.push_back(matrix[t][i]);//因为是顺时针,所以一定是在t行上从左到右遍历。
        }
        t++;//到右边界了,那么就要开始从上到下了,缩进一层,从t+1行开始.
        for(int i=t;i<=b&&l<=r;i++)//从上到下
        {
            num.push_back(matrix[i][r]);//因为是顺时针,所以此时一定在右边界上,所以从上到下是在r列
        }
        r--;//到下边界了,要开始从右到左了,缩进一层,从r-1列开始.
       for(int i=r;i>=l&&t<=b;i--)//从右到左
        {
            num.push_back(matrix[b][i]);//因为是顺时针,所以此时是在下边界上,所以是在b行
        }
        b--;//到左边界了,要开始从下到上了,缩进一层,从b-1行开始.
        for(int i=b;i>=t&&l<=r;i--)//从下到上
        {
            num.push_back(matrix[i][l]);//因为是顺时针,所以此时是在左边界上,所以是在l列
        }
        l++;//缩进一层,从l+1列开始从左到右
    }
    return num;
}

螺旋矩阵Ⅱ

题意

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

img

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 20

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix-ii

题解

这题实际上是螺旋矩阵的逆版。

 vector<vector<int>> generateMatrix(int n) {
     vector<vector<int>> matrix;
     int l=0;
     int r=n-1;
     int t=0;
     int b=n-1;
     matrix.resize(n);
     for(int i=0;i<n;i++)
     {
         matrix[i].resize(n);
     }//先开辟一个n*n的二维数组空间.
     int num=1;
 }

方法还是模拟顺时针遍历

但是边界不再是l<=r&&t<=b,因为它是1到n2的数,所以我们设一个变量num来记录遍历到第几个数了,当num>n2时退出。

所以边界为num<=n^2.

下面开始遍历

for(int i=l;i<=r;i++)//从左到右
{
    matrix[t][i]=num++;
}
t++;//到右边界了,那么就要开始从上到下了,缩进一层,从t+1行开始.
for(int i=t;i<=b;i++)//从上到下
{
	matrix[i][r]=num++;
}
r--;//到下边界了,要开始从右到左了,缩进一层,从r-1列开始.
for(int i=r;i>=l;i--)//从右到左
{
    matrix[b][i]=num++;
}
b--;//到左边界了,要开始从下到上了,缩进一层,从b-1行开始.
for(int i=b;i>=t;i--)//从下到上
{
    matrix[i][l]=num++;
}
l++;//缩进一层,从l+1列开始从左到右

以上4个循环一趟就是一圈,无限循环直到num>n^2时退出

参考代码

 vector<vector<int>> generateMatrix(int n) {
     vector<vector<int>> matrix;
     int l=0;
     int r=n-1;
     int t=0;
     int b=n-1;
     matrix.resize(n);
     for(int i=0;i<n;i++)
     {
         matrix[i].resize(n);
     }//先开辟一个n*n的二维数组空间.
     int num=1;
     while(num<=n*n)
     {
         for(int i=l;i<=r;i++)//从左到右
        {
            matrix[t][i]=num++;
        }
        t++;//到右边界了,那么就要开始从上到下了,缩进一层,从t+1行开始.
         for(int i=t;i<=b;i++)//从上到下
        {
            matrix[i][r]=num++;
        }
        r--;//到下边界了,要开始从右到左了,缩进一层,从r-1列开始.
         for(int i=r;i>=l;i--)//从右到左
        {
            matrix[b][i]=num++;
        }
        b--;//到左边界了,要开始从下到上了,缩进一层,从b-1行开始.
         for(int i=b;i>=t;i--)//从下到上
        {
            matrix[i][l]=num++;
        }
        l++;//缩进一层,从l+1列开始从左到右
     }
     return matrix;
     
 }
posted @ 2021-03-17 15:47  AntonyJ  阅读(87)  评论(0编辑  收藏  举报