LeetCode54螺旋矩阵——方向转变
题目描述:
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
解题思路:
螺旋输出一个矩阵的过程中需要四次改变方向:
第一次是由向右改为向下,上边界下移一行,也就是上边界+1
第二次是由向下改为向左,左边界左移一列,也就是右边界-1
第三次是由向左改为向上,下边界上移一行,也就是下边界-1
第四次上由向上改为向右,左边界右移一列,也就是左边界+1
在遍历完一行或一列时注意边界的调整。
题解代码
//可以时间优化
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if(matrix.empty()){
return {};
}
vector<int> ans;
int r=matrix.size();
int c=matrix[0].size();
int x[4]={0,1,0,-1};//向右、下、左、上
int y[4]={1,0,-1,0};
int up=1,left=0,right=c-1,down=r-1;
int xindex=0,yindex=0,direction=0;
for(int i=0;i<r*c;i++){
ans.push_back(matrix[xindex][yindex]);
if(direction==0&&yindex+1>right){//向右变为向下
direction=1;
right--;
}
if(direction==1&&xindex+1>down){//向下变为向左
direction=2;
down--;
}
if(direction==2&&yindex-1<left){//向左变为向上
direction=3;
left++;
}
if(direction==3&&xindex-1<up){//向上变为向右
direction=0;
up++;
}
xindex+=x[direction];
yindex+=y[direction];
}
return ans;
}
};