【数据结构与算法】力扣 59. 螺旋矩阵 II

news2024/10/21 20:28:31

题目描述

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 20

分析解答

思路:

  • 初始化一个 n×n 的矩阵,用 0 填充表示未填充的位置。

  • 定义边界:topbottomleftright,分别代表当前矩阵的上、下、左、右边界。

  • 用一个变量 num 记录当前要填入的数字,从 1 开始。

  • 按照顺时针方向填充矩阵,具体顺序为:

    • 从左到右填充顶部行,然后将 top 边界向下移动。
    • 从上到下填充右侧列,然后将 right 边界向左移动。
    • 从右到左填充底部行,然后将 bottom 边界向上移动。
    • 从下到上填充左侧列,然后将 left 边界向右移动。
  • 重复上述步骤,直到填满所有位置。

/**
 * @param {number} n
 * @return {number[][]}
 */
const generateMatrix = function(n) {
    const matrix = Array.from({ length: n }, () => Array(n).fill(0));
    let top = 0, bottom = n - 1;
    let left = 0, right = n - 1;
    let num = 1;

    while (num <= n * n) {
        // 从左到右填充
        for (let i = left; i <= right; i++) {
            matrix[top][i] = num++;
        }
        top++;

        // 从上到下填充
        for (let i = top; i <= bottom; i++) {
            matrix[i][right] = num++;
        }
        right--;

        // 从右到左填充
        if (top <= bottom) {
            for (let i = right; i >= left; i--) {
                matrix[bottom][i] = num++;
            }
            bottom--;
        }

        // 从下到上填充
        if (left <= right) {
            for (let i = bottom; i >= top; i--) {
                matrix[i][left] = num++;
            }
            left++;
        }
    }

    return matrix;
};

思路拓展

螺旋矩阵相关的问题,都可以通过一层一层遍历,通过一行一列、一行一列的顺序处理每个元素。

而且遍历过程中一定有一个规律,就是总有一个坐标是不变的,而另一个坐标在变。

解决螺旋矩阵题目时,可以总结出一些通用的解题方法和步骤。这些方法适用于填充矩阵或读取矩阵元素的螺旋顺序。

类似的题型见:螺旋矩阵

通用方法总结

  1. 定义边界变量

    • 使用 topbottomleftright 四个变量来表示当前矩阵的边界。
    • top 表示当前未填充区域的最上边行索引,bottom 表示最下边行索引。
    • left 表示未填充区域的最左边列索引,right 表示最右边列索引。
    • 这些边界变量随着螺旋填充或遍历逐渐收缩,直到遍历完成整个矩阵。
  2. 按照顺时针方向遍历或填充

    • 按照顺时针的顺序进行:从左到右(填充 top 行),从上到下(填充 right 列),从右到左(填充 bottom 行),从下到上(填充 left 列)。
    • 每次填充后,相应地缩小边界(如 top++bottom--left++right--)。
  3. 边界条件判断

    • 在每次填充新的行或列之前,判断当前的 top <= bottomleft <= right,确保当前边界仍然有效,防止重复填充或越界。
    • 这些判断可以避免在矩阵维度不对称时(如奇数维度矩阵)多次填充同一行或列。
  4. 循环控制条件

    • 通常使用一个 while 循环,当填充的数字还未达到矩阵总数 ( n^2 ) 时,继续循环。
    • 如果是读取矩阵中的元素,循环直到所有元素都遍历完。

解决螺旋矩阵问题的通用步骤

  1. 初始化矩阵和边界变量

    • 创建一个合适大小的矩阵,用来存放填充结果。
    • 初始化 topbottomleftright
  2. 进行螺旋顺序填充或读取

    • 按照顺时针顺序进行:从左到右,从上到下,从右到左,从下到上。
    • 每次填充或读取后,收缩相应的边界。
  3. 更新填充条件和检查边界

    • 进行边界检查,确保没有重复填充。
  4. 返回结果

    • 返回填充完的矩阵,或者返回读取顺序得到的结果。

注意事项

  • 边界条件的处理:确保在每次改变边界时进行有效的判断,避免多次填充同一行或列。
  • 初始化矩阵大小:根据题目的输入大小 ( n ) 确保矩阵初始化正确。
  • 边界收缩顺序:每次遍历结束后,适时更新 topbottomleftright 的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2219306.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring 获取URL中的参数

PathVariable 获取多个变量参数重命名 获取 URL 中的 Id&#xff0c;可以根据 Id 到数据库中筛选相应的内容 Id 的类型是可以定义的&#xff0c;这里定义为 Integer 类型 并且在 RequestMapping中需要定义路径 {articleId} PathVariable 从路径中获取 变量 获取多个变量 参数…

【软件运行类文档】项目试运行方案,试运行计划书(word原件)

一、 试运行目的 &#xff08;一&#xff09; 系统功能、性能与稳定性考核 &#xff08;二&#xff09; 系统在各种环境和工况条件下的工作稳定性和可靠性 &#xff08;三&#xff09; 检验系统实际应用效果和应用功能的完善 &#xff08;四&#xff09; 健全系统运行管理体制&…

jmeter发送post请求

在jmeter中&#xff0c;有两种常用的请求方式&#xff0c;get和post.它们两者的区别在于get请求的参数一般是放在路径中&#xff0c;可以使用用户自定义变量和函数助手等方式进行参数化&#xff0c;而post请求的参数不能随url发送&#xff0c;而是作为请求体提交给服务器。而在…

打开游戏提示丢失(或找不到)XINPUT1_3.DLL的多种解决办法

xinput1_3.dll是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它在Windows操作系统中扮演着重要的角色。该文件作为系统库文件&#xff0c;通常存放于C:\Windows\System32目录下&#xff08;对于32位系统&#xff09;或C:\Windows\SysWOW64目录下&#xff08;对于…

PPT自动化:快速更换PPT图片(如何保留原图片样式等参数更换图片)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 PPT更换图片 📒1. 安装 `python-pptx` 模块2. 加载PPT文件3. 查找并替换图片3.1 查找图片形状3.2 获取原图片的样式和位置3.3 替换图片4. 保存修改后的PPT文件5. 设置图片的相关参数5.1 设置透明度5.2 设置边框🚀 保留所有参…

FFmpeg 4.3 音视频-多路H265监控录放C++开发四 :RGB颜色

一 RGB 的意义&#xff1f; 为什么要从RGB 开始讲起呢&#xff1f; 因为最终传输到显卡显示器的颜色都是RGB 即使能处理YUV的API&#xff0c;本质上也是帮你做了从 YUV 到 RGB的转换。 RGB888 表示 R 占8bit&#xff0c;G 占8bit&#xff0c;B 占8bit&#xff0c;也就是每一…

内网微隔离,三步防横移——基于微隔离的横移攻击防护方案

引言 在网络攻防的战场上&#xff0c;横移攻击如同隐匿的刺客&#xff0c;一旦突破边界&#xff0c;便在内网肆意游走&#xff0c;给企业网络安全带来致命损害。当前多数企业数据中心内网如同未设防的城池&#xff0c;面对突破外围边界的“刺客”毫无招架之力。蔷薇灵动基于多…

Thread类的介绍

线程是操作系统中的概念&#xff0c;操作系统中的内核实现了线程这种机制&#xff0c;同时&#xff0c;操作系统也提供了一些关于线程的API让程序员来创建和使用线程。 在JAVA中&#xff0c;Thread类就可以被视为是对操作系统中提供一些关于线程的API的的进一步的封装。 多线…

基于SpringBoot+Vue+uniapp微信小程序的澡堂预订的微信小程序的详细设计和实现

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

Goland 搭建Gin脚手架

一、使用编辑器goland 搭建gin 打开编辑器 新建项目后 点击 create 二、获得Gin框架的代码 命令行安装 go get -u github.com/gin-gonic/gin 如果安装不上&#xff0c;配置一下环境 下载完成 官网git上下载 这样就下载完成了。、 不过这种方法需要设置一下GOPATH 然后再执…

Electron-(三)网页报错处理与请求监听

在前端开发中&#xff0c;Electron 是一个强大的框架&#xff0c;它允许我们使用 Web 技术构建跨平台的桌面应用程序。在开发过程中&#xff0c;及时处理网页报错和监听请求是非常重要的环节。本文将详细介绍 Electron 中网页报错的日志记录、webContents 的监听事件以及如何监…

【uniapp】打包成H5并发布

目录 1、设置配置mainifest.sjon 1.1 页面标题 1.2 路由模式 1.3 运行的基础路径 2、打包 2.1 打包入口 2.2 打包成功 2.3 依据目录找到web目录 3、 将web目录整体拷贝出来 4、上传 4.1 登录uniapp官网注册免费空间 4.2 上传拷贝的目录 4.3 检查上传是否正确 5、…

【软件测试】JUnit

Junit 是一个用于 Java 编程语言的单元测试框架&#xff0c;Selenium是自动化测试框架&#xff0c;专门用于Web测试 本篇博客介绍 Junit5 文章目录 Junit 使用语法注解参数执行顺序断言测试套件 Junit 使用 本篇博客使用 Idea集成开发环境 首先&#xff0c;创建新项目&#…

【Python-AI篇】人工智能python基础-计算机组成原理

1. 计算机组成原理 2. python基础&#xff08;查漏补缺&#xff09; 2.1 字符串 2.1.1 字符串查找方法 find()&#xff1a; 检测某个字符串是否包含在这个字符串中&#xff0c;在的话返回下标&#xff0c;不在的话返回-1index()&#xff1a; 检测某个字符串是否包含在这个字…

git命令使用一览【自用】

git常见操作&#xff1a; git initgit remote add master【分支名字】 gitgits.xxxxx【仓库中获取的ssh链接或者http协议的链接】检查远程仓库是否链接成功。 git remote -v出现以下画面就可以git pull,git push了

cefsharp63.0.3(Chromium 63.0.3239.132)支持H264视频播放-PDF预览 老版本回顾系列体验

一、版本 版本:Cef 63/CefSharp63.0.3/Chromium63.0.3239.132/支持H264/支持PDF预览 支持PDF预览和H264推荐版本 63/79/84/88/100/111/125 <

Java EE规范

1、简介 Java EE的全称是Java Platform, Enterprise Edition。早期Java EE也被称为J2EE&#xff0c;即Java 2 Platform Enterprise Edition的缩写。从J2EE1.5以后&#xff0c;就改名成为Java EE。一般来说&#xff0c;企业级应用具备这些特征&#xff1a;1、数据量特别大&…

java 文件File类概述

前言 在Java中&#xff0c;File类是一个与文件和目录&#xff08;文件夹&#xff09;路径名相关的抽象表示形式。它是java.io包中的一个重要类&#xff0c;用于表示和操作文件系统中的文件和目录。 File类的基本概念 表示路径&#xff1a;File类既可以表示文件路径&#xff…

【mod分享】波斯王子遗忘之沙高清重置,纹理,字体,贴图全部重置,特效增强,支持光追

各位好&#xff0c;今天小编给大家带来一款新的高清重置MOD&#xff0c;本次高清重置的游戏叫《波斯王子&#xff1a;遗忘之沙》。 《波斯王子&#xff1a;遗忘之沙》是由育碧&#xff08;Ubisoft&#xff09;开发并发行的一款动作类游戏&#xff0c;于2010年5月18日发行。游戏…

Linux执行source /etc/profile命令报错:权限不够问(已解决)

1.问题 明明以root账号登录Linux系统&#xff0c;在终端执行命令source /etc/profile时 显示权限不够 如下图&#xff1a; 2.问题原因 可能在编辑 /etc/profile 这个文件时不小心把开头的 井号 ‘#’ 给删除了 如图&#xff1a; 这里一定要有# 3.解决办法 进入/etc/pro…