螺旋矩阵 | LeetCode-59 | LeetCode-54 | 分类讨论

news2024/11/26 10:27:26
🙋大家好!我是毛毛张!
🌈个人首页: 神马都会亿点点的毛毛张
🎃分类不好,这道题就做不出来!🎈

📌LeetCode链接:59. 螺旋矩阵 II

📌LeetCode链接:54. 螺旋矩阵

文章目录

  • 题目1:螺旋矩阵II🍑
    • 1.题目描述🍒
    • 2.题解🍅
      • 2.1 直接法-分类讨论🥑
      • 2.2 方法二-解决中心值忘记赋值问题🥥
      • 2.3 方法3-通解🍊
  • 题目2:螺旋矩阵🍈
    • 1.题目描述🍊
    • 2.题解🍍
      • 2.1 方法1-通解🍌
      • 2.2 方法2🍇

题目1:螺旋矩阵II🍑

1.题目描述🍒

给你一个正整数 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

2.题解🍅

2.1 直接法-分类讨论🥑

class Solution {
    public int[][] generateMatrix(int n) {
        // 创建一个 n x n 的矩阵,用于存放螺旋顺序的数字
        int[][] result = new int[n][n];
        // 计算需要填充螺旋圈的数量(当 n 为偶数时,正好填满;当 n 为奇数时,中间会剩余一个元素)
        int k = n / 2;
        // 初始化数字计数器,从 1 开始
        int count = 1;
        // 定义四个边界:上、下、左、右
        int top = 0, bottom = n - 1;
        int left = 0, right = n - 1;

        // 循环处理每一层的螺旋圈
        for (int i = 0; i < k; i++) {
            // 从左到右填充当前顶部的一行
            for (int j = left; j < right; j++) result[top][j] = count++;
            // 从上到下填充当前右边的一列
            for (int j = top; j < bottom; j++) result[j][right] = count++;
            // 从右到左填充当前底部的一行
            for (int j = right; j > left; j--) result[bottom][j] = count++;
            // 从下到上填充当前左边的一列
            for (int j = bottom; j > top; j--) result[j][left] = count++;
            // 缩小边界,进入下一层螺旋圈
            left++;
            right--;
            top++;
            bottom--;
        }
        // 如果 n 是奇数,填充矩阵中心的最后一个元素
        if (n % 2 != 0) {
            result[left][top] = count;
        }
        // 返回填充好的螺旋矩阵
        return result;
    }
}

2.2 方法二-解决中心值忘记赋值问题🥥

class Solution {
    public int[][] generateMatrix(int n) {
        // 创建一个 n x n 的矩阵,用于存放螺旋顺序的数字
        int[][] result = new int[n][n];
        // 初始化数字计数器,从 1 开始
        int count = 1;
        // 目标值,表示填充到矩阵中的最大数字
        int target = n * n;
        // 定义四个边界:上、下、左、右
        int top = 0, bottom = n - 1;
        int left = 0, right = n - 1;

        // 开始填充矩阵,直到填满目标值
        while (count <= target) {
            // 从左到右填充当前顶部的一行
            for (int i = left; i <= right; i++) result[top][i] = count++;
            // 填充完一行后,移动上边界下移一行
            top++;
            // 从上到下填充当前右边的一列
            for (int i = top; i <= bottom; i++) result[i][right] = count++;
            // 填充完一列后,移动右边界左移一列
            right--;
            // 从右到左填充当前底部的一行
            for (int i = right; i >= left; i--) result[bottom][i] = count++;
            // 填充完一行后,移动下边界上移一行
            bottom--;
            // 从下到上填充当前左边的一列
            for (int i = bottom; i >= top; i--) result[i][left] = count++;
            // 填充完一列后,移动左边界右移一列
            left++;
        }
        // 返回填充好的螺旋矩阵
        return result;
    }
}

2.3 方法3-通解🍊

class Solution {
    public int[][] generateMatrix(int n) {
        // 创建一个 n x n 的矩阵用于存储结果
        int[][] result = new int[n][n];
        // 初始化从 1 开始的计数器
        int count = 1;
        // 目标计数为 n*n,表示矩阵中应有的最大值
        int target = n * n;
        // 定义四个边界:上(top)、下(bottom)、左(left)、右(right)
        int top = 0, bottom = n - 1;
        int left = 0, right = n - 1;

        // 循环继续,直到所有的边界都相交
        while (left <= right && top <= bottom) {
            // 从左到右填充矩阵的上边界
            for (int i = left; i <= right; i++) result[top][i] = count++;
            // 从上到下填充矩阵的右边界
            for (int i = top + 1; i <= bottom; i++) result[i][right] = count++;
            
            // 确保矩阵中至少有两行两列,然后填充底边和左边
            if (left < right && top < bottom) {
                // 从右到左填充矩阵的下边界
                for (int i = right - 1; i > left; i--) result[bottom][i] = count++;
                // 从下到上填充矩阵的左边界
                for (int i = bottom; i > top; i--) result[i][left] = count++;
            }
            
            // 调整边界,以缩小矩阵范围
            bottom--;
            right--;
            top++;
            left++;
        }

        // 返回生成的螺旋矩阵
        return result;
    }
}

题目2:螺旋矩阵🍈

1.题目描述🍊

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:
在这里插入图片描述

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

示例 2:
在这里插入图片描述

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

2.题解🍍

2.1 方法1-通解🍌

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        // 创建一个列表用于存储结果
        List<Integer> result = new ArrayList<>();
        // 获取矩阵的行数和列数
        int m = matrix.length;
        int n = matrix[0].length;
        // 定义四个边界:左(left)、右(right)、上(top)、下(bottom)
        int left = 0, right = n - 1;
        int top = 0, bottom = m - 1;
        // 循环执行,直到所有边界重合
        while (left <= right && top <= bottom) {
            // 从左到右填充矩阵的上边界
            for (int i = left; i <= right; i++) result.add(matrix[top][i]);
            // 从上到下填充矩阵的右边界
            for (int i = top + 1; i <= bottom; i++) result.add(matrix[i][right]);
            
            // 确保矩阵中至少有两行两列,然后填充底边和左边
            if (left < right && top < bottom) {
                // 从右到左填充矩阵的下边界
                for (int i = right - 1; i > left; i--) result.add(matrix[bottom][i]);
                // 从下到上填充矩阵的左边界
                for (int i = bottom; i > top; i--) result.add(matrix[i][left]);
            }
            
            // 调整边界,以缩小矩阵范围
            bottom--;  // 下边界上移
            right--;   // 右边界左移
            top++;     // 上边界下移
            left++;    // 左边界右移
        }

        // 返回最终的结果列表
        return result;
    }
}

2.2 方法2🍇

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        // 创建一个列表用于存储结果
        List<Integer> result = new ArrayList<>();

        // 获取矩阵的行数和列数
        int m = matrix.length;
        int n = matrix[0].length;

        // 定义四个边界:左(left)、右(right)、上(top)、下(bottom)
        int left = 0, right = n - 1;
        int top = 0, bottom = m - 1;

        // 循环执行
        while (left <= right && top <= bottom) {
            // 从左到右遍历矩阵的上边界,并将元素加入结果列表
            for (int i = left; i <= right; i++) result.add(matrix[top][i]);

            // 将上边界下移,如果上边界超过下边界,跳出循环
            if (++top > bottom) break;

            // 从上到下遍历矩阵的右边界,并将元素加入结果列表
            for (int i = top; i <= bottom; i++) result.add(matrix[i][right]);
            // 将右边界左移,如果左边界超过右边界,跳出循环
            if (left > --right) break;

            // 从右到左遍历矩阵的下边界,并将元素加入结果列表
            for (int i = right; i >= left; i--) result.add(matrix[bottom][i]);
            // 将下边界上移,如果上边界超过下边界,跳出循环
            if (top > --bottom) break;

            // 从下到上遍历矩阵的左边界,并将元素加入结果列表
            for (int i = bottom; i >= top; i--) result.add(matrix[i][left]);     
            // 将左边界右移,如果左边界超过右边界,跳出循环
            if (++left > right) break;
        }

        // 返回最终的结果列表
        return result;
    }
}

ottom) break;

        // 从下到上遍历矩阵的左边界,并将元素加入结果列表
        for (int i = bottom; i >= top; i--) result.add(matrix[i][left]);     
        // 将左边界右移,如果左边界超过右边界,跳出循环
        if (++left > right) break;
    }

    // 返回最终的结果列表
    return result;
}

}








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

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

相关文章

李晨晨的嵌入式学习 DAY25

今天对昨天的fork函数进行了补充&#xff0c;并且学习了exec函数 一&#xff0c;fork函数补充 1.open在fork之前 子进程会继承父进程已打开的相关信息&#xff0c;父子进程会影响同一个offset值 2.open在fork之后 父子进程各自有各自打开的文件信息&#xff0c;不相互影响 …

Luatos-lua For MacOSX

0x00 缘起 看到Luatos-soc-pc项目能够编译到MacOS平台并且运行&#xff0c;所以尝试编译&#xff1b;可是Apple Clang编译器太过于严格&#xff0c;导致编译不通过。遂换到gcc-11编译通过&#xff0c;虽然其中依旧会报错&#xff08;宏定义LUA_USE_MACOSX不起作用&#xff0c;导…

Linux驱动入门实验班——LED驱动(附百问网视频链接)

目录 一、确定引脚编号 二、编写思路 2.1驱动层 2.2应用层 三、源码 四、实现 课程链接 一、确定引脚编号 首先&#xff0c;可以在开发板上执行如下命令查看已经在使用的GPIO状态&#xff1a; cat /sys/kernel/debug/gpio 可以看到每个gpio都有对应的编号&#xff0c;…

岗位信息采集全攻略:两种方法快速获取招聘信息

摘要 本文将揭秘两大实战策略&#xff0c;助你在激烈的人才市场中迅速捕捉前程无忧上的宝贵岗位信息&#xff0c;无论是手动搜索还是利用现代技术手段&#xff0c;都能事半功倍&#xff0c;抢占先机。 正文 一、手动搜索的艺术&#xff1a;精准定位&#xff0c;深度挖掘 1.…

【网络】传输层TCP协议的报头和传输机制

目录 引言 报头和有效载荷 确认应答机制 超时重传机制 排序和去重 连接管理机制 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 引言 TCP是传输层协议&#xff0c;全称传输控制协议。TCP报头中有丰富的字段以及协议本身会制定完善的策略来保证网络传输的可靠性。 TCP…

ICM-20948芯片详解(12)

接前一篇文章&#xff1a;ICM-20948芯片详解&#xff08;11&#xff09; 六、寄存器详解 2. USER BANK 0寄存器详述 &#xff08;56&#xff09;FIFO_EN_1 参考代码&#xff1a; 无。 &#xff08;57&#xff09;FIFO_EN_2 ACCEL_FIFO_EN 1 —— 以采样率将ACCEL-XOUT_H、…

haproxy实例

什么是haproxy Haproxy是一款提供高可用性&#xff0c;负载均衡以及基于tcp和http的的应用交付控制器的开源软件。它由法国人威利塔罗使用c语言开发的。它广泛用于管理和路由网络流量&#xff0c;并确保应用程序的高可用性和高性能。 haproxy的功能 提供第4层&#xff08;TCP层…

vulnhub系列:Hackademic.RTB1

vulnhub系列&#xff1a;Hackademic.RTB1 靶机下载 一、信息收集 nmap 扫描存活&#xff0c;根据 mac 地址寻找 IP nmap 192.168.23.0/24nmap 扫描端口&#xff0c;开放端口&#xff1a;22、80 nmap 192.168.23.143 -p- -Pn -sV -O访问80端口&#xff0c;页面发现 target …

DirectX修复工具解决问题:一步步教你排除常见错误

在日常使用电脑的过程中&#xff0c;许多用户可能会遇到与DirectX相关的问题&#xff0c;特别是在运行大型游戏或图形密集型应用程序时。这种情况下&#xff0c;选择一款合适的DirectX修复工具免费版来解决问题至关重要&#xff01; 我们将分享六款好用的DirectX修复工具&…

字节Java后端二面也太难了吧...

粉丝投稿&#xff0c;字节二面直接连环问场景题&#xff0c;难以招架&#xff0c;已经准备好市场上常见的场景题了&#xff0c;希望能帮助你&#xff01; 由于平台篇幅原因&#xff0c;很多内容展示不了&#xff0c;需要这份《java面试宝典》的伙伴们转发文章关注后&#xff…

Linux_Shell变量及运算符-05

一、Shell基础 1.1 什么是shell Shell脚本语言是实现Linux/UNIX系统管理及自W动化运维所必备的重要工具&#xff0c; Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的内容。Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算…

MySQL基础练习题38-每位教师所教授的科目种类的数量

目录 题目 准备数据 分析数据 总结 题目 查询每位老师在大学里教授的科目种类的数量。 准备数据 ## 创建库 create database db; use db;## 创建表 Create table If Not Exists Teacher (teacher_id int, subject_id int, dept_id int)## 向表中插入数据 Truncate table…

ALB使用指南|深入探究 lj-lua-stacks:如何生成 Lua 代码级别的火焰图?

前言 ALB&#xff08;Another Load Balancer&#xff09;是一款由灵雀云基于 OpenResty 开发的开源Kubernetes&#xff08;K8s&#xff09; 网关&#xff0c;拥有多年的生产环境使用经验。Openresty框架高性能的基础上&#xff0c;提供了一系列高级特性&#xff0c;包括多租户支…

JsonUtility和JsonConvert.DeserializeObject

文章目录 JsonUtility 和 JsonConvert在字符串转类型时的不同总结 JsonUtility 和 JsonConvert在字符串转类型时的不同 不同&#xff1a; JsonUtility.FromJson要转的字符串内不能有注释的字符串 但JsonConvert.DeserializeObject要转的字符串里可以有 原因&#xff1a;. Jso…

新品|暴雨发布第四代工作站静安系列-TR1176

极致性能引领未来 暴雨信息推出全新一代工作站——静安系列TR1176&#xff0c;搭载了强劲的第四代处理器&#xff0c;为客户带来前所未有的计算速度与效率。无论是处理大规模数据集、复杂算法还是高负载多任务&#xff0c;都能轻松应对&#xff0c;确保客户的工作流程顺畅无阻…

【随笔】Java 连接操作FTP与SFTP 详细指南

引言 在Java开发中&#xff0c;文件传输协议&#xff08;FTP&#xff09;和安全文件传输协议&#xff08;SFTP&#xff09;是处理文件传输的两种常见方式。FTP是标准的网络文件传输协议&#xff0c;而SFTP则在FTP基础上增加了安全层&#xff08;SSH&#xff09;&#xff0c;提…

设计模式 之 —— 组合模式

目录 什么是组合模式&#xff1f; 定义 特点 结构 组合模式&#xff08;java代码示例&#xff09; 首先定义接口 定义叶节点&#xff08;Leaf类&#xff09; 定义容器节点&#xff08;Composite类&#xff09; 测试类&#xff1a; 树形图 运行结果&#xff1a; 组…

CUDA Programming - (1) CUDA简介

1. GPU 简介 处理器一般包含以下几部分&#xff1a;Cache 缓存&#xff0c;ALU 计算单元&#xff0c;Control 控制中心&#xff0c;RAM 内存。 CPU&#xff08;Central Processing Unit&#xff09;&#xff1a;中央处理器。适合进行逻辑&#xff0c;ALU计算核心较少。适合控…

乒乓球桌上的AI新星:谷歌机器人Agent,是竞技的未来,还是科技的幻想?

在巴黎奥运会乒乓球的激烈角逐中&#xff0c;一个不同寻常的选手悄然登场——谷歌的乒乓球机器人Agent。 这是首个在竞技水平上达到人类标准的AI机器人。 01 AI机器人颠覆初级玩家 Agent不仅能够在正反手之间自如转换&#xff0c;连续进攻&#xff0c;甚至在面对诸如长球、高…

【Qt】QWidegt的enable属性

enabled&#xff1a;描述了一个控件是否处于“可用”状态&#xff08;相对的概念“禁用”&#xff09;。 API说明 isEnabled() 获取到控件的可⽤状态 setEnabled 设置控件是否可使⽤. true 表⽰可⽤, false 表⽰禁⽤ 所谓“禁用”指的是该控件不能接收任何用户的输入事件…