题目如下:
解题思路:
对于这种螺旋遍历的方法,重要的是要确定上下左右四条边界的位置。
- 初始化时,上边界up就是0,下边界down就是m-1,左边界left是0,右边界right是n-1;
- 然后进行while循环,先遍历上边界,将所有元素加入结果res,然后上边界下移一位,如果此时上边界大于下边,说明此时已经遍历完成了,直接break。;
- 之后遍历右边界,将所有元素加入结果res,然后右边界左移一位,如果此时右边界小于左边界,说明此时已经遍历完成了,直接break;
- 下边界和左边界同理。
代码如下:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if(matrix.size() == 0 || matrix[0].size() == 0)
return {};
int m = matrix.size(); //行
int n = matrix[0].size(); //列
//确定上下左右四条边线的位置
int up = 0, down = m-1; //当前螺旋输出的上下边界
int left = 0, right = n-1; //当前螺旋输出的左右边界
while(true){
//输出上边界行元素
for(int i = left; i <= right; i++)
res.push_back(matrix[up][i]);
if(++up > down) break; //更新上边界并判断
//输出右边界列元素
for(int i = up; i <= down; i++)
res.push_back(matrix[i][right]);
if(--right < left) break; //更新右边界并判断
//输出下边界行元素
for(int i = right; i >= left; i--)
res.push_back(matrix[down][i]);
if(--down < up) break; //更新下边界并判断
//输出左边界列元素
for(int i = down; i >= up; i--)
res.push_back(matrix[i][left]);
if(++left > right) break; //更新左边界并判断
}
return res;
}
};