可以用递归来做,每一次这当前的这一圈加入 vector<int> answer。
但需要注意,不要枚举圈数,这样代码比较难写(需要考虑的边界条件挺多的,而且很多下标还要自己算)。。可以直接枚举上下左右边界,
坑点:matrix.size() == 0,或者 matrix[0].size() == 0 的情况
class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { if(matrix.size() == 0 || matrix[0].size() == 0) return {}; solve(matrix, 0, matrix[0].size() - 1, 0, matrix.size() - 1); return ans; } void solve(vector<vector<int>> &matrix, int lef, int rig, int top, int bot) { // left, right, top, bottom if(lef > rig || top > bot) return ; if(lef == rig) { for(int i = top; i <= bot; ++ i) ans.emplace_back(matrix[i][lef]); return ; } if(top == bot) { for(int i = lef; i <= rig; ++ i) ans.emplace_back(matrix[top][i]); return ; } for(int i = lef; i <= rig; ++ i) ans.emplace_back(matrix[top][i]); for(int i = top + 1; i <= bot; ++ i) ans.emplace_back(matrix[i][rig]); for(int i = rig - 1; i >= lef; -- i) ans.emplace_back(matrix[bot][i]); for(int i = bot - 1; i > top; -- i) ans.emplace_back(matrix[i][lef]); solve(matrix, lef + 1, rig - 1, top + 1, bot - 1); } vector<int> ans; };