1. 程式人生 > >LeetCode54 59 螺旋矩陣 螺旋矩陣II (陣列)

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;
    }
};```