超级棒的方法,自己想破脑袋也想不出。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
//顺时针输出,搞清楚每一位的下一位是哪里
//一层一层来输出,每一层分上下左右
//最上面往右,最右边往下,最下边往左,最左边往上
//上边界 top : 0
//下边界 bottom : matrix.length - 1
//左边界 left : 0
//右边界 right : matrix[0].length - 1
vector<int> res;
if(matrix.size() == 0 || matrix[0].size() == 0) return res;
int top = 0, bottom = matrix.size()-1,left=0,right = matrix[0].size()-1;
while(top < bottom && left<right){
//不遍历到底的情况
for(int i = left; i < right; ++i) res.push_back(matrix[top][i]);
for(int i = top; i < bottom; ++i) res.push_back(matrix[i][right]);
for(int i = right; i > left; --i) res.push_back(matrix[bottom][i]);
for(int i = bottom; i > top; --i) res.push_back(matrix[i][left]);
top++;
left++;
bottom--;
right--;
}
//最后还剩一行
if(top == bottom){
for(int i = left; i <= right; ++i){
res.push_back(matrix[top][i]);
}
}
//最后还剩一列
else if(right == left){
for(int i = top; i <= bottom; ++i){
res.push_back(matrix[i][left]);
}
}
return res;
}
};
好几刷了,还是感觉很棒
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
//层层缩进就行了,每层的操作都是上右下左
vector<int> res;
if(matrix.size() == 0 || matrix[0].size() == 0) return res;
int left = 0, right = matrix[0].size()-1, top = 0, bottom = matrix.size()-1;
while(left < right && top < bottom){
for(int i = left; i < right; ++i) res.push_back(matrix[top][i]);
for(int i = top; i < bottom; ++i) res.push_back(matrix[i][right]);
for(int i = right; i > left; --i) res.push_back(matrix[bottom][i]);
for(int i = bottom; i > top; --i) res.push_back(matrix[i][left]);
left++;
right--;
top++;
bottom--;
}
if(top == bottom){
for(int i = left; i <= right; ++i){
res.push_back(matrix[top][i]);
}
}
else{
for(int i = top; i <= bottom; ++i){
res.push_back(matrix[i][left]);
}
}
return res;
}
};