zoukankan      html  css  js  c++  java
  • 螺旋矩阵

    螺旋矩阵

    题意

    给你一个 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;
         
     }
    
  • 相关阅读:
    拉普拉斯矩阵
    正定矩阵 和 半正定矩阵
    Random Walk
    论文解读(DGI)《DEEP GRAPH INFOMAX》
    python安装easyinstall/pip出错
    pip国内源设置
    在Jupyter Notebook添加代码自动补全功能
    [BUUCTF]PWN——bjdctf_2020_babystack2
    [BUUCTF]REVERSE——[BJDCTF 2nd]8086
    [BUUCTF]PWN——jarvisoj_tell_me_something
  • 原文地址:https://www.cnblogs.com/AntonyJ/p/14549785.html
Copyright © 2011-2022 走看看