PROBLEM
剑指 Offer 29. 顺时针打印矩阵
MY ANSWER
仅使用圈数作为边界条件没写出来。
BETTER SOLUTION
设置上下左右四条边界,边界相遇时说明打印完毕,从而避免漏打或者多打。时间复杂度O(NM),空间复杂度O(1)。
class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int> res; if(!matrix.size()) { return res; } int m = matrix.size() - 1; int n = matrix[0].size() - 1; int l = 0, r = n, t = 0, b = m; while(true) { for(int i = l; i <= r; i++) { res.push_back(matrix[t][i]); } if(++t > b) { break; } for(int i = t; i <= b; i++) { res.push_back(matrix[i][r]); } if(l > --r) { break; } for(int i = r; i >= l; i--) { res.push_back(matrix[b][i]); } if(t > --b) { break; } for(int i = b; i >= t; i--) { res.push_back(matrix[i][l]); } if(++l > r) { break; } } return res; } };
|
SUMMARY
设置多个边界使问题变得更加清晰,更容易进行边界判断。