1. 程式人生 > >leetcode第一刷_Spiral Matrix

leetcode第一刷_Spiral Matrix

dsm 問題 leetcode row 註意 ++ 避免 solution 退出

我認為這個題好無聊啊,好端端一個數組。幹嘛要跟比巴蔔一樣轉一圈輸出呢。

思想非常easy,每次從左到右。再從上到下,在從右到左,再從下到上。問題是每次到什麽時候該改變方向。我的做法是用一個變量保存當前在第幾層。這個層是相對於從外向內有幾圈來說的。註意想清楚邊界的話這個題一點也不難。有個細節,我的循環退出條件是訪問的數跟矩陣總個數之間的關系,假設有一次在推斷進入循環是條件是滿足的。可是在循環內部不滿足了,我的策略是忽略這樣的情況。盡管這樣會在結果集中多加一些反復的數據,可是以我的算法。一定是先訪問沒有訪問過的數據。再訪問反復數據的,因此能夠回退回去。避免了考慮每次在循環裏都考慮有沒有到達越界的情況。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int> > &matrix) {
        int msize = matrix.size();
        vector<int> res;
        if(msize == 0)  return res;
        if(msize == 1)  return matrix[0];
        int cur = 0, row = msize, column = matrix[0].size(), i=0, j=0, level = 0;
        while(cur<row*column){
            while(j<column-level) {res.push_back(matrix[i][j++]); ++cur;}
            --j;++i;
            while(i<row-level)  {res.push_back(matrix[i++][j]); ++cur;}
            --j;--i;
            while(j>=level) {res.push_back(matrix[i][j--]); ++cur;}
            ++j;--i;
            while(i>level)  {res.push_back(matrix[i--][j]); ++cur;}
            ++j;++i;
            ++level;
        }
        while(cur>row*column){
            res.pop_back();
            cur--;
        }
        return res;
    }
};


leetcode第一刷_Spiral Matrix