思路:
模拟矩阵的顺时针螺旋,用一个变量来记录矩阵含有的元素个数,然后在模拟的过程中,每模拟一个方格,就让该变量–,以该变量是否大于0来作为螺旋循环的条件,
模拟顺时针画矩阵的过程:
-
填充上行从左到右
-
填充右列从上到下
-
填充下行从右到左
-
填充左列从下到上
由外向内一圈一圈这么画下去。
代码:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int>res;//结果集,用来存矩阵中所有元素
if(matrix.size()==0) return res;
int left = 0;//每次循环一行的起始位置初始化为0
int right = matrix[0].size()-1;//每次循环行的结束位置
int top = 0;//每次循环一列的起始位置初始值为0
int bottom = matrix.size()-1;//每次循环的结束位置
int temp = matrix.size() * matrix[0].size();//矩阵中元素的总个数
while(temp >= 1){
//四个for循环模拟转一圈,循环条件中要加上temp>=1这个条件,
//模拟遍历上行从左到右
for(int i = left;i <= right && temp >= 1;i++){
res.push_back(matrix[top][i]);
temp--;
}
top++;//遍历完一行后,top边界下移,即top++,右列遍历的起始为top
//模拟遍历右列从上到下
for(int j = top;j <= bottom && temp >= 1;j++){
res.push_back(matrix[j][right]);
temp--;
}
right--;//遍历完右列后,right边界左移,right--
//模拟遍历下行从右到左
for(int i=right; i >= left && temp >= 1; i--){
res.push_back(matrix[bottom][i]);
temp--;
}
bottom--;
//模拟遍历左列从下到上
for(int j=bottom; j >= top && temp >= 1; j--){
res.push_back(matrix[j][left]);
temp--;
}
left++;
}
return res;
}
};
/*时间复杂度:O(mn)
空间复杂度:O(mn)*/
版权声明:本文为qq_45823984原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。