Leetcode_59. 螺旋矩阵 II

解题思路:

这道题没有什么算法知识,纯粹的模拟,只要模拟对了,这个题就可以拿下。但是这道题的难点就在这里,我们在解题之前一定要确定好自己的方向,以及处理好边界问题,采取统一原则,即左闭右开,左闭右闭等(本题解采用左闭右开)

上图:

第一圈:

刚开始时,start_x和start_y都处于0的位置,offset表示抵消,本题采用的是左闭右开原则,所以这里的offset为1

第一次填充效果如上,y轴不变,改变start_x的大小

准备开始填充自上向下,此时start_x不变,改变start_y,方法同上

start_y不变改变start_x

start_x不动,改变start_y

填充完毕,最后判断这个n是奇数还是偶数,如果是偶数的话,就直接返回,如果是奇数的话,还需要填充一下最中间的值

AC代码:

cpp 复制代码
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        //首先先创建一个存储答案的二维vector
        vector<vector<int>>ans(n,vector<int>(n));
        //创建初始变量,x轴y轴,还有需要被抵消的变量offse,记录当前数字的count
        int start_x=0,start_y=0,offset=1,count=1;
        //计算总共需要转多少圈
        int t=n/2;
        //通过i,j分别控制行和列,i代表行,j代表列
        int i=0,j=0;
        while(t--){
            //在每次循环之前先进行初始化操作
            i=start_y;
            j=start_x;
            //开始螺旋的过程,开始从左向右,遵循左闭右开原则,例如当n等于 3 的时候,从左到右就只需填充 1 2 
            for(;j<n-offset;j++){
                ans[i][j]=count++;
            }
            //从上向下
            for(;i<n-offset;i++){
                ans[i][j]=count++;
            }
            //从右向左
            for(;j>=offset;j--){
                ans[i][j]=count++;
            }
            //从下向上
            for(;i>=offset;i--){
                ans[i][j]=count++;
            }
            offset++,start_x++,start_y++;
        }
        if(n%2!=0) ans[n/2][n/2]=count;
        return ans;
    }
};
相关推荐
小O的算法实验室20 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
郭涤生21 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿21 小时前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz1 天前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能1 天前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****1 天前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能1 天前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能1 天前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数
CoderCodingNo1 天前
【GESP】C++四、五级练习题 luogu-P1177 【模板】排序
数据结构·c++·算法
Proxy_ZZ01 天前
从零实现LDPC比特翻转译码器:C语言实战与底层逻辑解析
c语言·算法