力扣第五十九题——螺旋矩阵II

news2024/9/21 22:58:39

内容介绍

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 20

完整代码

 class Solution {
    public int[][] generateMatrix(int n) {
        int l = 0, r = n - 1, t = 0, b = n - 1;
        int[][] mat = new int[n][n];
        int num = 1, tar = n * n;
        while(num <= tar){
            for(int i = l; i <= r; i++) mat[t][i] = num++; // left to right.
            t++;
            for(int i = t; i <= b; i++) mat[i][r] = num++; // top to bottom.
            r--;
            for(int i = r; i >= l; i--) mat[b][i] = num++; // right to left.
            b--;
            for(int i = b; i >= t; i--) mat[i][l] = num++; // bottom to top.
            l++;
        }
        return mat;
    }
}

思路详解

代码功能

这段代码定义了一个名为Solution的类,其中包含一个名为generateMatrix的方法。该方法用于生成一个按顺时针顺序填充的n阶矩阵,矩阵中的元素从1开始递增,直到n*n。

思路详解

  1. 初始化边界变量

    • lr分别表示矩阵的左边界和右边界,初始值分别为0和n-1。
    • tb分别表示矩阵的顶部边界和底部边界,初始值分别为0和n-1。
  2. 创建矩阵

    • 使用new int[n][n]创建一个n阶矩阵mat,用于存储填充的元素。
  3. 初始化填充变量

    • num表示当前要填充的数字,初始值为1。
    • tar表示填充的目标值,即n*n。
  4. 循环填充矩阵

    • 使用while循环,当num小于等于tar时,继续填充矩阵。
  5. 按顺时针顺序填充矩阵

    • 从左到右填充顶部行:使用for循环,从左边界l到右边界r,填充顶部行mat[t][i],并将num递增。
    • 从上到下填充右侧列:使用for循环,从顶部边界t到底部边界b,填充右侧列mat[i][r],并将num递增。
    • 从右到左填充底部行:使用for循环,从右边界r到左边界l,填充底部行mat[b][i],并将num递增。
    • 从下到上填充左侧列:使用for循环,从底部边界b到顶部边界t,填充左侧列mat[i][l],并将num递增。
  6. 更新边界

    • 在每完成一轮填充后,更新边界变量:顶部边界t向下移动一位(t++),右边界r向左移动一位(r--),底部边界b向上移动一位(b--),左边界l向右移动一位(l++)。
  7. 返回填充后的矩阵

    • num大于tar时,循环结束,返回填充好的矩阵mat

总结

这段代码通过不断缩小矩阵的边界,并在每轮循环中按照顺时针顺序填充矩阵,最终生成一个按顺时针顺序递增的n阶矩阵。整个算法的时间复杂度为O(n^2),空间复杂度为O(n^2),适用于需要生成螺旋矩阵的场景

知识点精炼

 

 矩阵初始化
  • 使用int[n][n]声明并初始化一个二维数组,用于存储螺旋矩阵的元素。
2. 边界控制
  • 使用四个变量l(左边界)、r(右边界)、t(上边界)、b(下边界)来控制矩阵的填充范围。
3. 循环填充
  • 使用while循环,条件为当前填充数字num小于等于矩阵元素总数tar(即n*n)。
4. 顺时针填充顺序
  • 顶部行:从左到右填充,更新上边界t
  • 右侧列:从上到下填充,更新右边界r
  • 底部行:从右到左填充,更新下边界b
  • 左侧列:从下到上填充,更新左边界l
5. 边界收缩
  • 在每轮填充后,相应地调整边界变量的值,以缩小下一次填充的范围。
6. 返回结果
  • 当填充完毕,返回填充好的二维数组mat
7. 算法效率
  • 时间复杂度:O(n^2),因为每个元素都需要填充一次。
  • 空间复杂度:O(n^2),用于存储矩阵的二维数组。
8. 编程技巧
  • 使用嵌套for循环实现矩阵的顺时针填充。
  • 通过边界变量的调整,简化循环逻辑,避免复杂的条件判断。 

扩展:如何避免填充重复数字 

在给出的代码中,填充重复数字通常是由于边界调整不当导致的。为了确保每个数字只填充一次,需要仔细管理边界变量的更新。以下是避免填充重复数字的几个关键点:

  1. 更新边界前检查:在每轮填充完成后,确保在更新边界之前,新边界不会与旧边界重叠。

  2. 避免边界重叠:在每次循环结束时,更新边界之前,应该检查是否已经到达了矩阵的极限边界,以避免重叠。

以下是修改后的代码,其中包含了避免填充重复数字的逻辑:

class Solution {
    public int[][] generateMatrix(int n) {
        int l = 0, r = n - 1, t = 0, b = n - 1;
        int[][] mat = new int[n][n];
        int num = 1, tar = n * n;
        while(num <= tar){
            // 从左到右填充顶部行
            for(int i = l; i <= r; i++) mat[t][i] = num++;
            t++; // 更新上边界

            // 从上到下填充右侧列
            for(int i = t; i <= b; i++) mat[i][r] = num++;
            r--; // 更新右边界

            // 确保底部行未被填充
            if(t <= b) {
                // 从右到左填充底部行
                for(int i = r; i >= l; i--) mat[b][i] = num++;
                b--; // 更新下边界
            }

            // 确保左侧列未被填充
            if(l <= r) {
                // 从下到上填充左侧列
                for(int i = b; i >= t; i--) mat[i][l] = num++;
                l++; // 更新左边界
            }
        }
        return mat;
    }
}

在上述代码中,我添加了两个if语句来检查在填充底部行和左侧列之前,新的上边界t是否已经超过了下边界b,以及新的左边界l是否已经超过了右边界r。这样可以确保在矩阵的最后一行和最后一列时不会重复填充。

通过这种方式,我们可以确保每个数字只被填充一次,避免了任何可能的重复填充问题。

 

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

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

相关文章

基于SpringBoot的网络海鲜市场系统的设计与实现

TOC springboot219基于SpringBoot的网络海鲜市场系统的设计与实现 绪论 1.1 选题背景 当人们发现随着生产规模的不断扩大&#xff0c;人为计算方面才是一个巨大的短板&#xff0c;所以发明了各种计算设备&#xff0c;从结绳记事&#xff0c;到算筹&#xff0c;以及算盘&…

【ubuntu24.04】远程开发:微软RDP;ssh远程root登录;clion以root远程

本地配置了一台ubutnu服务器,运行各种服务。偶尔会远程过去,做一些UI操作。感觉nomachine的就是会模糊一些,可能是默认的编码比较均衡?RDP更清晰? RDP 与nomachine比,更清晰,但是貌似不支持自动缩放窗口?默认的配置就比较高:GPT的建议 安装xrdp还要配置session:1. 安…

从零开始搭建k8s集群详细步骤

声明&#xff1a;本文仅作为个人记录学习k8s过程的笔记。 节点规划&#xff1a; 两台节点为阿里云ECS云服务器&#xff0c;操作系统为centos7.9&#xff0c;master为2v4GB,node为2v2GB,硬盘空间均为40GB。&#xff08;节点基础配置不低于2V2GB&#xff09; 主机名节点ip角色部…

链表(linked_list)的理解以及实现

链表的概念&#xff1a; 链表是一种线性数据结构&#xff0c;其中的每个元素都是一个节点对象&#xff0c;各个节点通过“引用”相连接。引用记录了下一个节点的内存地址&#xff0c;通过它可以从当前节点访问到下一个节点。 可以看出&#xff1a;链表物理结构不是连续的 链…

在Ubuntu 13.10上安装Hadoop的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 先决条件 本教程的唯一先决条件是安装了 Ubuntu 13.10 x64 的 VPS。 您需要通过以下两种方式之一在命令行中执行命令&#xff1a; 使用…

AI芯片:高性能卷积计算中的数据复用

随着深度学习的飞速发展&#xff0c;对处理器的性能要求也变得越来越高&#xff0c;随之涌现出了很多针对神经网络加速设计的AI芯片。卷积计算是神经网络中最重要的一类计算&#xff0c;本文分析了高性能卷积计算中的数据复用&#xff0c;这是AI芯片设计中需要优化的重点之一&a…

XSS游戏前五关

分享一个XSS游戏的链接 XSS Game 第一关&#xff1a; 这边有一个innerHTML属性&#xff0c;我们查看官方文档 我们找到了它存在的漏洞&#xff0c;直接利用 https://sandbox.pwnfunction.com/warmups/ma-spaghet.html?somebody<img src1 onerror"alert(1337)&quo…

工具推荐篇:《Chat-PPT一键AI生成专属风格演示文稿》

引言 在当今快节奏的工作环境中&#xff0c;制作高质量的演示文稿既是一项挑战也是一门艺术。传统的PPT制作往往需要花费大量的时间和精力&#xff0c;尤其是在寻找合适的模板、设计布局和选择色彩搭配等方面。 今天给大家推荐一款AI一键制作高质量PPT的工具。 AI如何改变PP…

CANoe软件中Trace窗口的筛选栏标题不显示(空白)的解决方法

文章目录 问题描述原因分析解决方案扩展知识总结问题描述 不知道什么情况,CANoe软件中Trace窗口的筛选栏标题突然不显示了,一片空白。现象如下: 虽然不影响CANoe软件的使用,但是观感上非常难受,对于强迫症患者非常不友好。 原因分析 按照常规思路,尝试了: 1、重启CAN…

8月强化|30天带刷张宇18讲核心重点!

不偏不难就不是张宇了&#xff01; 张宇老师本来就以“偏难怪”著称&#xff0c;无独有偶&#xff0c;24考研真题也是“偏难怪”&#xff01; 所以&#xff0c;24考研结束之后&#xff0c;大家欧鼓吹张宇「封神」 先不说张宇老师是不是真的符合考研的趋势&#xff0c;但是跟…

解决 git clone 失败问题

使用 git clone 指令&#xff0c;从 G i t H u b GitHub GitHub克隆项目时失败&#xff0c;提示信息为&#xff1a; fatal: unable to access https://github.com/***/***: Failed to connect to github.com port 443 after 21083 ms:Couldnt connect to server解决方法 出现…

Chromium编译指南2024 - Android篇:从Linux版切换到Android版(六)

1.引言 在前面的章节中&#xff0c;我们介绍了如何获取 Chromium for Android 的源代码。然而&#xff0c;您可能已经在本地拥有了用于 Linux 版的 Chromium 源代码&#xff0c;并希望切换到 Android 版进行编译和开发。为了避免重新拉取大量的代码&#xff0c;您可以通过配置…

趋动科技成为GSMA 5G IN创新会员,专注于软件定义AI算力技术

趋动科技 趋动科技作为软件定义AI算力技术的领导厂商&#xff0c;专注于为全球用户提供国际领先的数据中心级AI算力虚拟化和资源池化软件及解决方案。趋动科技的 OrionX AI 算力资源池化软件能够帮助用户提高资源利用率和降低TCO&#xff0c;提高算法工程师的工作效率。凭借标…

谷歌、火狐、Edge浏览器使用allWebPlugin中间件加载ActiveX控件

安装allWebPlugin中间件 1、请从下面地址下载allWebPlugin中间件产品 链接&#xff1a;百度网盘 请输入提取码百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百…

数据结构与算法分析winform算术表达式求值计算

数据结构与算法分析算术表达式求值计算 数据结构与算法分析 实验三 算术表达式求值计算 要求&#xff1a;创建Form窗体&#xff0c;输入算术表达式&#xff0c;计算出表达式结果。 基本思路&#xff1a; &#xff08;1&#xff09;将表达式串拆分成操作数和操作符混合的字符…

【数据结构】使用C语言建立邻接矩阵表示有向图

有向图的邻接矩阵构建 有向图的定义 先回顾下有向图的定义&#xff1a; 有向图是一副具有方向性的图&#xff0c;是有一组顶点和一组有方向的边组成的&#xff0c;每条方向的边都连接着一对有序的顶点。 有向图的邻接矩阵的特点 有向图邻接矩阵中第i行非零元素的个数为第i个顶…

背部筋膜炎怎么根治

背部筋膜炎是一种常见的疾病&#xff0c;背部筋膜炎的症状主要包括&#xff1a; 1、疼痛&#xff1a;这是背部筋膜炎最明显的症状&#xff0c;疼痛可表现为酸痛、胀痛或刺痛&#xff0c;轻重不一。疼痛通常在劳累后加重&#xff0c;休息后减轻。 2、僵硬&#xff1a;由于无菌…

Java Web —— 第五天(请求响应1)

postman Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 作用:常用于进行接口测试 简单参数 原始方式 在原始的web程序中&#xff0c;获取请求参数&#xff0c;需要通过HttpServletRequest 对象手动获 http://localhost:8080/simpleParam?nameTom&a…

部署fiji(ImageJ)

本文介绍fiji的部署。 1.从 https://github.com/fiji/fiji ​​​​​​下载 zip包&#xff0c;下载后解压&#xff0c;本人解压的路径是H:\fiji-master&#xff0c;后面都用这个路径。 1. 打开Intellij idea&#xff0c;点击 import project 点击OK后&#xff0c;一路next &…

Azkaban学习笔记

1 Azkaban概述 为什么需要工作流调度系统&#xff1f; 1&#xff09;一个完整的数据分析系统通常都是由大量任务单元组成&#xff1a;Shell脚本程序&#xff0c;Java程序&#xff0c;MapReduce程序、Hive脚本等 2&#xff09;各任务单元之间存在时间先后及前后依赖关系 3&#…