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

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

📌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.rhkb.cn/news/396534.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac平台M1PRO芯片MiniCPM-V-2.6网页部署跑通

Mac平台M1PRO芯片MiniCPM-V-2.6网页部署跑通 契机 ⚙ 2.6的小钢炮可以输入视频了&#xff0c;我必须拉到本地跑跑。主要解决2.6版本默认绑定flash_atten问题&#xff0c;pip install flash_attn也无法安装&#xff0c;因为强制依赖cuda。主要解决的就是这个问题&#xff0c;还…

移动端上拉分页加载更多(h5,小程序)

1.h5,使用原生方式监听页面滚动上拉分页加载更多 <template><div></div> </template><script> export default {data() {return {loadflag: true,maxpages: 0, //最大页码currentpage: 0, //当前页listData: [],config: {page: 1,pageSize: 15,…

Netty技术全解析:DelimiterBasedFrameDecoder类深度解析

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

Java中等题-交错字符串(力扣)

给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串 &#xff1a; s s1 s2 ... snt t1 t2 ... tm|n - m| < 1交错 是…

AI入门指南(二):算法、训练、模型、大模型是什么?

文章目录 一、前言二、算法是什么&#xff1f;概念实际应用 三、训练是什么&#xff1f;概念实际应用 四、模型是什么&#xff1f;概念实际应用小结 五、大模型是什么&#xff1f;概念大模型和小模型有什么区别&#xff1f;大模型分类实际应用 六、总结七、参考资料 一、前言 …

37.【C语言】指针(重难点)(B)

目录&#xff1a; 5.疑问解答&#xff1a;指针的解引用 6.指针或-整数 7.特殊类型*void指针 承接上篇19.【C语言】指针&#xff08;重难点&#xff09;&#xff08;A&#xff09; 5.疑问解答&#xff1a;指针的解引用 观察下列代码产生的现象 #include <stdio.h> int …

代码随想录算法训练营day39||动态规划07:多重背包+打家劫舍

多重背包理论 描述&#xff1a; 有N种物品和一个容量为V 的背包。 第i种物品最多有Mi件可用&#xff0c;每件耗费的空间是Ci &#xff0c;价值是Wi 。 求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量&#xff0c;且价值总和最大。 本质&#xff1a; …

yolov8旋转目标检测部署教程(附代码c++/python)

为了编写一个详细的YOLOv8旋转目标检测ONNX部署教程&#xff0c;我们需要考虑几个关键点&#xff1a;模型转换为ONNX格式、ONNX模型的部署以及后处理逻辑。由于YOLOv8本身还未发布&#xff0c;我们将基于现有的知识和技术来进行推断。 以下是部署YOLOv8旋转目标检测模型到ONNX…

【经验分享】ShardingSphere+Springboot-03 : COMPLEX_INLINE 复杂行表达式分片算法

文章目录 3.3 复杂分片算法3.3.1 COMPLEX_INLINE 复杂行表达式分片算法 3.3 复杂分片算法 3.3.1 COMPLEX_INLINE 复杂行表达式分片算法 复合分片比较灵活&#xff0c;适合于分片的字段比较多&#xff0c;分片比较复杂的场景&#xff0c;使用这种分片的话必须对自己的业务比较…

AWS生成式AI项目的全生命周期管理

随着人工智能技术的迅速发展&#xff0c;生成式 AI 已成为当今最具创新性和影响力的领域之一。生成式 AI 能够创建新的内容&#xff0c;如文本、图像、音频等&#xff0c;具有广泛的应用前景&#xff0c;如自然语言处理、计算机视觉、创意设计等。然而&#xff0c;构建一个成功…

PythonStudio 控件使用常用方式(十八)TCategoryButtons

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;它使用的是Delphi的控件&#xff0c;常用的内容是与Delphi一致的。但是相关文档并一定完整。现在我试试能否逐步把它的控件常用用法写一点点&#xff0c;也作为PythonStudio的参考。 从1.2.1版开始&#xff0c;Python…

jsp-图书管理系统

一、系统介绍 本系统为图书管理系统&#xff0c;主要围绕图书管理和会员管理两个核心内容展开&#xff0c;图书管理包括图书的上架&#xff0c;下架&#xff0c;图书的借阅&#xff0c;归还&#xff0c;定损等&#xff1b; 会员管理包括会员注册&#xff0c;充值&#xff0c;损…

【Datawhale X 魔搭 】AI夏令营第四期AIGC方向,Task1:可图Kolors-LoRA风格AI图片生成入门(持续更新)

第一步&#xff1a;下载baseline文件 &#xff08;1&#xff09;安装lfs&#xff0c;用于git脚本命令下载大文件 git lfs install 在AI模型和数据集中&#xff0c;通常包含一些较大的文件&#xff0c;例如图像或模型参数。这些文件可能会超过普通Git仓库的处理能力。git lfs 可…

【Linux SQLite数据库】一、SQLite交叉编译与移植

SQLite 是一个用 C 语言编写的开源、轻量级、快速、独立且高可靠性的 SQL 数据库引擎&#xff0c;它提供了功能齐全的数据库解决方案。SQLite 几乎可以在所有的手机和计算机上运行&#xff0c;它被嵌入到无数人每天都在使用的众多应用程序中。此外&#xff0c;SQLite 还具有稳定…

【电控笔记z6】无感文献综述

高频注入 afabeta注入 lq/ld越大统好 凸极性大反电动势ZVCD pwm电压向量为主 增加动态特性 设计隆博戈估测器 高频注入: lq/ld比较大 运用在低转速 到高速的时候 , 切换到model_base的方法进行反电动势侦测 smo :速度无法很低 有个极限 受杂讯影响大 高速时候用 总结 用spm …

UE基础 —— 编辑器界面

菜单栏 UE中每个编辑器都有一个菜单栏&#xff0c;部分菜单会出现在所有编辑器窗口中&#xff0c;如File、Window、Help&#xff0c;其他则是其编辑器特有的&#xff1b; 主工具栏 UE中部分最常用的工具和命令的快捷方式&#xff1b; 1&#xff0c;保存按钮&#xff08;ctrls&a…

深入探索大模型:从基础到实践,开启AI之旅

摘要&#xff1a; 在人工智能领域&#xff0c;大模型技术正成为推动创新和进步的关键力量。对于初学者而言&#xff0c;掌握大模型的基本概念、理论和技术是至关重要的。 本文将为你提供一个全面的学习路线&#xff0c;帮助你从基础知识出发&#xff0c;逐步深入到大模型的实践…

探索Python的文本转换魔法:html2text库的奥秘

文章目录 **探索Python的文本转换魔法&#xff1a;html2text库的奥秘**背景&#xff1a;为何选择html2text&#xff1f;这个库是什么&#xff1f;如何安装这个库&#xff1f;简单使用&#xff1a;5个基本函数介绍场景应用&#xff1a;3个实际使用示例常见问题与解决方案总结 探…

Linux 进程调度(三)之进程的优先级

目录 一、概述二、进程的优先级1、基础概念2、优先级的意义3、查看优先级4、PRI 和 NI5、修改优先级6、控制进程的优先级的系统调用7、调整优先级的限制 一、概述 在 Linux 中&#xff0c;每个进程都有一个优先级。优先级决定了进程在系统资源分配中的先后顺序。Linux 中的进程…

NBT:单细胞转录组新降维可视化方法PHATE

新降维可视化 NGS系列文章包括NGS基础、转录组分析 &#xff08;Nature重磅综述|关于RNA-seq你想知道的全在这&#xff09;、ChIP-seq分析 &#xff08;ChIP-seq基本分析流程&#xff09;、单细胞测序分析 (重磅综述&#xff1a;三万字长文读懂单细胞RNA测序分析的最佳实践教程…