leecode54.螺旋矩形

free1993發表於2020-12-09

題目

螺旋矩形

思路分析

  • 每次都是遍歷外面的一圈,所以使用(lx,ly)表示左上角的點,用(rx,ry)表示右下角的點。
  • 行-列-行-列遍歷

注意的點

  • 處理四個角,防止重複訪問。
  • 處理最後可能只剩一行或者一列的重複遍歷的情況,防止重複遍歷。

程式碼

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int lx = 0, ly = 0, rx = matrix.size() - 1, ry = matrix[0].size() - 1;
        vector<int> ans;
        while(lx <= rx && ly <= ry){ //(lx,ly)表示左上角的點,(rx,ry)表示右下角的點
            for(int col = ly; col <= ry; col++)
                ans.push_back(matrix[lx][col]);
            for(int row = lx + 1; row <= rx; row++)
                ans.push_back(matrix[row][ry]);
            for(int col = ry - 1; col >= ly && lx != rx; col--) //有可能最後剩一行,lx!=rx避免重複遍歷
                ans.push_back(matrix[rx][col]);
            for(int row = rx - 1; row > lx && ly != ry; row--)//有可能最後只剩一列,ly != ry避免遍歷
                ans.push_back(matrix[row][ly]);
            lx++, ly++, rx--, ry--;      
        }
        return ans;
    }
};

相關文章