題目: 螺旋矩陣
描述:
給你一個 m 行 n 列的矩陣 matrix ,請按照 順時針螺旋順序 ,返回矩陣中的所有元素。
示例:
輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出:[1,2,3,6,9,8,7,4,5]
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
leetcode鏈接
方法一:模擬
我們順時針螺旋輸出矩陣的順序可以看成為輸出一個個子矩陣的邊框,即每個矩陣的第一行,最后一列,最后一行,第一列,然后去除掉重復輸出的四個對角,再對下一個子矩陣循環此輸出,考慮特殊情況當子矩陣為一行或者一列時候,直接輸出一行或者一列。
如下圖所示,螺旋輸出該矩陣
第一次依次輸出最外層矩陣四個邊框,然后去除重復元素(即4個角多輸出了一次)
再輸出子矩陣的四個邊框,重復操作,直到沒有子矩陣
時間復雜度:o(mn) 矩陣每個元素遍歷一次,一共m*n個元素
空間復雜度:o(1)
vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> ans;int m = matrix.size(),n = matrix[0].size();int r = 0,l = 0;while(m>0&&n>0){for(int j=l;j<l+n;j++){//輸出第一行ans.push_back(matrix[r][j]);}if(m==1)break;ans.pop_back();//取出重復存儲的元素for(int i=r;i<r+m;i++){//輸出最后一列ans.push_back(matrix[i][l+n-1]);}if(n==1)break;ans.pop_back();//取出重復存儲的元素for(int j=l+n-1;j>=l;j--){//輸出最后一行ans.push_back(matrix[r+m-1][j]);}ans.pop_back();//取出重復存儲的元素for(int i=r+m-1;i>=r;i--){//輸出第一列ans.push_back(matrix[i][l]);}ans.pop_back();//取出重復存儲的元素m-=2,n-=2;//更新下一個子矩陣的行列數r++,l++;//更新下一個子矩陣的第一個元素的行列下標}return ans;}