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

力扣经典算法篇-40-螺旋矩阵(方向遍历:方向数组+已访问元素集合)

1、题干

给你一个 m 行 n 列的矩阵 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、解题

方法一:(方向遍历:方向数组+已访问元素集合)

本题要按照顺时针的方向遍历已有的二维数组。

思路:遍历数组,沿着一个方向添加数据,当达到切换方向条件时,切换方向添加数据,直到最终达到最大次数。
第一,因为要顺时针遍历,不是顺序遍历的规律,所以不可使用二层for循环遍历原始数据,需要记录原始二维数组的两个索引值进行遍历,索引值要根据规律去逐步更新。
第二,注意方向变化的规律。下一个元素如果越界就需要切换方向。如:小于0或大于最大列或行等情况。当然遇到已经访问过的元素也需要切换方向,所以这里还需要一个临时和原始数组一模一样的二维boolean数组来记录访问过的元素。
第三,方向的控制需要借助一个固定的二维数组{0, 1}, {1, 0}, {0, -1}, {-1, 0}代表右,下,左,上的四个方向。注意方向不能越界,可以加1后,对4取余数的方式获取新的方向。

代码示例:

import java.util.ArrayList;
import java.util.List;public class Test46 {public static List<Integer> spiralOrder(int[][] matrix) {List<Integer> result = new ArrayList<>();// 防止空元素if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {return result;}int rows = matrix.length;     // 行数int cols = matrix[0].length;   // 列数int count = rows * cols;      // 行数*列数 = 最大遍历次数int dirIndex = 0;  // 方向索引int[][] dirArr = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};   // 方向集合。 右,下,左,上int index1 = 0, index2 = 0;   // 元素索引boolean[][] visited = new boolean[rows][cols];   // 已遍历过元素的标记留痕for (int i = 0; i < count; i++) {        // 这里不用while循环,用count作为做大循环处理更安全。// 添加元素result.add(matrix[index1][index2]);visited[index1][index2] = true;// 校验方向是否改变int nextIndex1 = index1 + dirArr[dirIndex][0];int nextIndex2 = index2 + dirArr[dirIndex][1];if (nextIndex1 < 0 || nextIndex1 >= rows || nextIndex2 < 0 || nextIndex2 >= cols || visited[nextIndex1][nextIndex2]) {dirIndex++;dirIndex = dirIndex % 4;}// 获取下一个元素值index1 = index1 + dirArr[dirIndex][0];index2 = index2 + dirArr[dirIndex][1];}return result;}public static void main(String[] args) {int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};System.out.println(spiralOrder(matrix));}
}

向阳前行,Dare To Be!!!

http://www.dtcms.com/a/313192.html

相关文章:

  • 【ROS2】常用命令
  • 04.Redis 的多实例
  • 双八无碳小车设计【16张cad】三维图+设计说明书
  • 【C++ 初级工程师面试--5】inline内联函数特点 、和普通函数的区别、什么时候适合内联?
  • json-server 快速搭建本地 Mock 数据服务
  • Day23--回溯--39. 组合总和,40. 组合总和 II,131. 分割回文串
  • Android 之 MVC架构
  • 线段树学习笔记 - 摩尔投票问题
  • I2C基础
  • mybatis-plus从入门到入土(四):持久层接口之BaseMapper和选装件
  • PHP现代化全栈开发:前后端分离与API架构实践
  • uni-app学习笔记01-项目初始化及相关文件
  • Go语言常量
  • 11.消息队列
  • 计算机视觉CS231n学习(2)
  • 从马武寨穿越关山
  • ICCV 2025 | EPD-Solver:西湖大学发布并行加速扩散采样算法
  • p5.js 用 beginGeometry () 和 endGeometry () 打造自定义 3D 模型
  • 控制建模matlab练习06:比例积分控制-②PI控制器
  • 达梦数据库联机备份和脱机备份的区别
  • Centos7 安装Python3.11
  • 【Linux系统编程】进程信号
  • leecode2958 最多K个重复元素的最长子数组
  • 解决飞书文档中PDF文档禁止下载的问题
  • 提升工作效率的利器:Qwen3 大语言模型
  • Python 程序设计讲义(60):Python 的函数——递归函数
  • 出现OOM怎么排查
  • 研报复现|史蒂夫·路佛价值选股法则
  • linux ollama模型缓存位置变更
  • 音视频学习(四十九):音频有损压缩