leetcode59:螺旋矩阵||(思路+详解)

一:题目

在这里插入图片描述

二:思路

1.我们需要模拟数字的变化过程,
2.模拟填充的过程:(顺时针)
填充上行 从左到右
填充右行 从上到下
填充下行 从右向左
填充左行 从下到上
3.分析我们填充数字的过程,比如n=3的时候
上行:1,2
右行:3,4
下行:5,6
左行:7,8
这么分析下来我们每次填充的规律也就是 左开右闭

三:上码

class Solution {
public:

    /***
    思路:1.我们需要模拟数字的变化过程,
         2.模拟填充的过程:(顺时针)
            填充上行 从左到右
            填充右行 从上到下
            填充下行 从右向左
            填充左行 从下到上
         3.分析我们填充数字的过程,比如n=3的时候
            上行:1,2
            右行:3,4
            下行:5,6
            左行:7,8

            这么分析下来我们每次填充的规律也就是  左开右闭       

    **/


    vector<vector<int>> generateMatrix(int n) {
            vector<vector<int> >ans(n,vector<int>(n,0));//用vector定义一个二维数组
            int loop = n/2;//这个求出模拟几圈,比如 n = 3 那就模拟一圈,n= 4那就需要模拟两圈
            int mid = n/2;//当n=3为奇数的时候,我们可以知道最中间的一个值下标(1,1)
            int border = 1;//这个是为了控制我们每次遍历的时候长度
            int count = 1;//第一值的大小
            int startx = 0,starty = 0;//记录每一圈的开始位置
            int i,j;

            while(loop--){
                i = startx;
                j = starty;

                //四个for循环模拟转一圈

                //模拟上行从左到右(左开右闭)
                for(j = starty; j < starty+n-border; j++){//starty+n-border:这里 可以拿n=4时来理解
                    ans[startx][j] = count++;//这里是行不变 列变
                }

                //模拟右行 从上到下(左开右闭)
                for(i = startx; i < startx+n-border; i++){
                    ans[i][j] = count++;//这里是行变 列不变 列为第一个for循环中的j
                }

                //模拟下行 从右向左(左开右闭)(这里的左开右闭是相对于for循环来说的)
                for(;j > starty; j--) {
                    ans[i][j] = count++;//这里行不变  列在变(行取的是第二个for循环的i
                }

                //模拟左行  从下到上(左开右闭)
                for(;i > startx; i--){
                    ans[i][j] = count++;//这里是行在变  列不变  (列取的是第三个for循环中的i)
                }

                startx++;//如果有两圈的话那么起始位置就变了,拿n=4举例,第一圈起始位置(0,0),第二圈的起始位置为(1,1)
                starty++;

                border+=2;//当到第二圈的时候,我们的边界为3,也就是一行的第一个位置不可取,倒数第一个倒数第二个位置不可取
            }
            
            if(n%2 != 0){
                ans[mid][mid] = count;
            }   

            return ans;
    }
};

在这里插入图片描述

渣渣杰又水了一道 这个模拟的过程有意思 对数组玩的真溜

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天向上的菜鸡杰!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值