当前位置: 首页 > news >正文

leetcode59------螺旋矩阵II

一、题目简介

题目链接:59. 螺旋矩阵 II - 力扣(LeetCode) 

给你一个正整数 n ,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

示例1: 

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 4 ,输出:[[1,2,3,4],[12,13,14,5],[11,16,15,6],[10,9,8,7]]

示例 3: 

输入:n = 1
输出:[[1]]

提示:

  • 1 <= n <= 20

 螺旋矩阵填充元素处理思路:
先定义一个新矩阵Matrix,该矩阵中的所有元素初始化为0。
然后,我们可以设置一个count变量,初始化为1,使得count自增来表示矩阵中每个位置要填的内容。

现在,要如何将count填写在矩阵中的相应位置上?根据螺旋矩阵的特点,即从外圈到最中间的数据呈现从1到n*n分布,方向为顺时针,我们可以先填充最外圈的元素,然后再填充次外圈的元素,依此类推,直到最后一圈(n为偶数)或最后一个元素(n为奇数)填充完毕。

每次在对某一圈上的元素进行填写时,都会涉及到四条不同的边,那么我们肯定是希望在填充这四条边的时候能尽量对称的填写,即每条边填写元素相等,例如:对于3×3矩阵,我们在填写最外圈时希望每条边填写2个元素,因为这样保证了每条边都会填写两个元素,确保对称填写。

填写过程即横向由左向右填写,即填写Matrix[0][0]以及Matrix[0][1];纵向由上向下,即填写Matrix[0][2]以及Matrix[1][2];横向由右向左填写,即填写Matrix[2][2]以及Matrix[2][1];纵向由下向上,即填写Matrix[0][2]以及Matrix[0][1];如下图所示:

在每圈填写的过程中,需要填写四次,我们可以使用for循环来对每条边进行固定元素数量的填写。

这样填写的话,当n为偶数, n/2 圈即可填写完成,比如:4×4矩阵两圈即可填写完成;当n为奇数,n/2圈填写到矩阵中,剩余一个中心元素单独处理,例如:3×3矩阵需要一个外圈加上一个中心元素单独处理。

代码:

#include<vector>
#include<iostream>
class solution{
    public:
        std::vector<std::vector<int>> generateMatrix(int n) {
            
            std::vector<std::vector<int>> Matrix(n,std::vector<int>(n,0)); // 定义一个全新 n×n 矩阵,所有元素均为 0
            int loop=n/2; // loop表示填满 Matrix 所需的圈数
            int offset = 1; // offset 控制每一圈里每一条边遍历的长度
            int count = 1; // 给每个位置赋值
            int i,j;
            
            int startx=0,starty=0; // 定义每循环一个圈的起始位置
            while(loop){ 
                i = startx;
                j = starty;
                // 下面的四个 for 循环表示转一圈
                // 填充横向(由左到右)
                for(j;j<n-offset;j++){
                    Matrix[i][j] = count;
                    count++;
                }
                // 填充竖向(由上到下)
                for(i;i<n-offset;i++){
                    Matrix[i][j] = count;
                    count++;
                }
                // 填充横向(由右到左)
                for(;j>starty;j--){
                    Matrix[i][j] = count;
                    count++;
                }
                // 填充竖向(由下到上)
                for(;i>startx;i--){
                    Matrix[i][j] = count;
                    count++;
                }
                // 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
                startx++;
                starty++;

                loop--; // 每填充一圈,loop自减
                offset++; // offset 控制每一圈里每一条边遍历的长度
            }

            // 如果 n 为奇数,需单独给矩阵最中间的位置赋值
            if(n%2==1){
                Matrix[n/2][n/2]=count; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2)
            }
            return Matrix; // 返回填充好的矩阵
        }
};


int main(){
    int n=4; // 输入一个正整数
    solution s1; // 实例化一个对象
    std::vector<std::vector<int>> matrix = s1.generateMatrix(n);
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            std::cout<<" "<<matrix[i][j];
        }
    }
    std::cout<<std::endl;

}

该题目的讲解:

一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili

相关文章:

  • sqlilab 46 关(布尔、时间盲注)
  • 用数组实现树的存储遍历【复习笔记】
  • 3DUNet-Pytorch-master环境配置(3dunet)
  • (IDE接入DeepSeek)简单了解DeepSeek接入辅助开发与本地部署建议
  • 【前端基础】Day 2 CSS层叠样式表
  • 说一下 SpringMVC的运行流程?
  • 代码随想录算法【Day54】
  • 系统架构设计:软件测试需要掌握的常用方法
  • pytorch阶段性总结1
  • 前端模拟请求池-浏览器同时发起大量请求
  • mysql 拼接多行合并为一行
  • 入门网络安全工程师要学习哪些内容【2025年寒假最新学习计划】
  • 机试刷题_HJ106 字符逆序【python】
  • 【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.1.2典型应用场景:日志分析、实时搜索、推荐系统
  • Redis|事务
  • 网络七层模型—OSI参考模型详解
  • Fiddler在Windows下抓包Https
  • HGAME2025 Week1
  • 尚硅谷爬虫note13
  • 一张表解释01背包问题
  • 农林生物安全全国重点实验室启动建设,聚焦重大有害生物防控等
  • 黄土是他们的气质:打破宁夏当代油画创作的沉寂
  • 哈尔滨工业大学原副校长王魁业逝世,享年92岁
  • 告别户口本!今天起婚姻登记实现全国通办
  • 韩国前国务总理韩德洙加入国民力量党
  • 第四轮伊美核谈判将于11日在阿曼举行