LeetCode54螺旋矩阵——改变方向,顺序输出

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;
    }
};

猜你喜欢

转载自blog.csdn.net/Andy_ss/article/details/107502308