LeetCode54 59 螺旋矩阵 螺旋矩阵II (数组)

1.螺旋矩阵

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

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

示例 2:
输入:
[[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
思路:可以根据环的个数来遍历这个矩阵,环个数的计算为 l o o p = m i n ( c l o u m s + 1 , r o w s + 1 ) / 2 loop=min(cloums+1, rows+1)/2 , 然后通过遍历每个环的四条边可以得到,环的四条边如下:
边1:
[[1 , 2 , 3 , 4 ] ,
[5, 6, 7, 8],
[9,10,11,12]]
边1+边2:
[[1 , 2 , 3 , 4 ] ,
[5, 6, 7, 8 ],
[9,10,11,12 ]]
边1+边2+边3:
[[1 , 2 , 3 , 4 ] ,
[5, 6, 7, 8 ],
[9 ,10 ,11 ,12 ]]
边1+边2+边3+边4:
[[1 , 2 , 3 , 4 ] ,
[5 , 6, 7, 8 ],
[9 ,10 ,11 ,12 ]]

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> empty_matrix;
        if(matrix.size()==0) return empty_matrix;
        vector<int> spiralarray;
        int colums=matrix[0].size();
        int rows=matrix.size();
        int loop=rows<colums?(rows+1)/2:(colums+1)/2;
        int col=colums,row=rows;
        for(int i=0;i<loop;i++){
            for(int a=i;a<colums-i;a++){
                spiralarray.push_back(matrix[i][a]);
            }
            for(int b=i+1;b<rows-i;b++){
                spiralarray.push_back(matrix[b][colums-i-1]);
            }
            if(col==1 || row==1) break;
            for(int c=colums-i-2;c>i-1;c--){
                spiralarray.push_back(matrix[rows-i-1][c]);
            }
            for(int d=rows-i-2;d>i;d--){
                spiralarray.push_back(matrix[d][i]);
            }
            col=col-2;
            row=row-2;
        }
        return spiralarray;
    }
};

2.螺旋矩阵II

给定一个正整数 n,生成一个包含 1 到 n 2 n^{2} 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[ [ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]]
解题思路:思路类似于螺旋矩阵, 只不过先请求一个容器,然后赋值到每个索引即可。

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> tempMatrix(n,vector<int>(n));
        int value=1;
        int topLoop=(n+1)/2;
        int col=n;
        int row=n;
        for(int loop=0;loop<topLoop;++loop){
            for(int a=loop;a<n-loop;++a){  
                tempMatrix[loop][a]=value;
                ++value;
            }
            for(int b=loop+1;b<n-loop;++b){ 
                tempMatrix[b][n-loop-1]=value;
                ++value;
            }
            if(col==1 || row==1){
                break;
            }
            for(int c=n-loop-2;c>loop-1;--c){ 
                tempMatrix[n-loop-1][c]=value;
                ++value;
            }
            for(int d=n-loop-2;d>loop;--d){ 
                tempMatrix[d][loop]=value;
                ++value;
            }
            row=row-2;
            col=col-2;
        }
        return tempMatrix;
    }
};```

猜你喜欢

转载自blog.csdn.net/Hansry/article/details/83385328