描述
给定一个包含 m x n 个要素的矩阵,(m 行, n 列),按照螺旋顺序,返回该矩阵中的所有要素。
样例
给定如下矩阵:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
给定一个包含 m x n 个要素的矩阵,(m 行, n 列),按照螺旋顺序,返回该矩阵中的所有要素。
样例
给定如下矩阵:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
应返回 [1,2,3,6,9,8,7,4,5]。
分析
首先确定最左上角的点和最右下角的点,然后不断地回字形打印。
程序
class Solution { public: /** * @param matrix: a matrix of m x n elements * @return: an integer list */ vector<int> results; void SaveEdge(vector<vector<int>> &m, int tR, int tC, int dR, int dC){ if(tR == dR) //子矩阵只有一行 for(int i = tC; i<=dC; i++) results.push_back(m[tR][i]); else if(tC == dC) //子矩阵只有一列 for(int i = tR; i <= dR; i++) results.push_back(m[i][tC]); else{ //一般情况 int curC = tC; int curR = tR; while(curC != dC) results.push_back(m[tR][curC++]); while(curR != dR) results.push_back(m[curR++][dC]); while(curC != tC) results.push_back(m[dR][curC--]); while(curR != tR) results.push_back(m[curR--][tC]); } } vector<int> spiralOrder(vector<vector<int>> &matrix) { // write your code here if(matrix.empty()) return results; int tR = 0; int tC = 0; int dR = matrix.size() - 1; int dC = matrix[0].size() - 1; while(tR <= dR && tC <= dC) SaveEdge(matrix, tR++, tC++, dR--, dC--); return results; } };