runtime 0 ms, beats 100% of cpp submissions
O(mn) solution with explanation
tags: simulation
🔗 link
Spiral Matrix
📖 description
給定一個 2 維陣列 (不一定是方陣),依照螺旋順序儲存成 1 維陣列。

ex.
    Input: 
        matrix = [[1,2,3],[4,5,6],[7,8,9]]
    Output: 
        [1,2,3,6,9,8,7,4,5]
🧠 solution
依照題意模擬操作,分成 4 個動作,分別是依照邊界對上下左右讀取,維護邊界的同時也要維護一個當前狀態來區分動作。
⏳ time complexity
遍歷一次 2 維陣列,時間複雜度 O(mn) ,其中 m 、 n 表示陣列的長寬。
總時間複雜度 O(mn)
📝 code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
   | class Solution { public:     vector<int> spiralOrder(vector<vector<int>>& m) {                  int l = 0,r = m[0].size()-1,t = 0,d = m.size()-1;         int state = 0;         vector<int> ans;         while(l<=r && t<=d){             if(state == 0){                      for(int i=l;i<=r;i++){                     ans.emplace_back(m[t][i]);                 }                 t++;             }             else if(state == 1){                      for(int i=t;i<=d;i++){                     ans.emplace_back(m[i][r]);                 }                 r--;             }             else if(state == 2){                     for(int i=r;i>=l;i--){                     ans.emplace_back(m[d][i]);                 }                 d--;             }             else{                                    for(int i=d;i>=t;i--){                     ans.emplace_back(m[i][l]);                 }                 l++;             }             state = (state+1)%4;             }         return ans;     } };
  |