【模拟】【顺时针选择方向模拟】LeetCode54.螺旋矩阵

在这里插入图片描述
LeetCode54.螺旋矩阵

思路:

我们分析顺时针旋转过程:

  1. 方向旋转是一个循环运动;
  2. 方向会在适当位置会变: i.边界; ii.遇到遍历过的点;
  3. 方向的运行过程: 正右、正下、正左、正上;

那么怎么实现呢?

  • 对于1:循环,我们联想到模运算;
  • 对于2:新增visited矩阵,记录遍历过的点;
  • 对于3:二维矩阵或pair,模拟单位方向向量;

代码:

class Solution {
public:
    // 观察图可知,变动的部分有两个
    // 1.点每一次移动一步
    // 2.方向会在适当时会变
    // 模拟出这两个点就可以模拟螺旋移动;关键在掌握方向的变动
    // 对于方向:1.每次变动跟上一次是具有恒定的继承关系:右下左上 2. 遇到边界变动一次 3.遇到遍历过的变动一次
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int directions[4][2] = {{0,1},{1,0},{0,-1},{-1,0}}; // 正右,正下,正左,正上
        int directionindex = 0;

        int n = matrix[0].size();
        int m = matrix.size();

        vector<vector<bool>> ump(m,vector<bool>(n,0));
        
        vector<int> ans;
        int row =0; int col =0;
        for(int step=0;step<n*m;step++)
        {
            ump[row][col] = 1;
            ans.push_back(matrix[row][col]);
            int nextrow= row + directions[directionindex][0]; int nextcol =col+ directions[directionindex][1];
            if(nextrow <0 || nextrow >= m || nextcol<0 || nextcol>=n || ump[nextrow][nextcol])
            {
                directionindex  = (directionindex+1)%4;
            }
            row+=directions[directionindex][0];col+=directions[directionindex][1];
           
        }
        
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值