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

设置多个边界使问题变得更加清晰,更容易进行边界判断。