将一个二维矩阵,螺旋遍历展开为一维列表

news/2024/11/9 5:16:08/
matrix = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]]# 获取二维列表的行数并存放到变量 rows 中
# 获取二维列表的列数并存放到变量 cols 中
rows = len(matrix)
cols = len(matrix[0])left = 0
right = cols - 1
top = 0
bottom = rows - 1result = []while left <= right and top <= bottom:# 从左往右遍历for col in range(left, right + 1):result.append(matrix[top][col])# 从上往下遍历for row in range(top + 1, bottom + 1):result.append(matrix[row][right])if left < right and top < bottom:# 从右往左遍历for col in range(right - 1, left, -1):result.append(matrix[bottom][col])# 从下往上遍历for row in range(bottom, top, -1):result.append(matrix[row][left])left = left + 1right = right - 1top = top + 1bottom = bottom - 1print(result)

这个代码的目的是将一个二维矩阵按照螺旋顺序(也叫做"螺旋遍历")展开为一维列表。我们来详细分析这个代码:

### 1. **初始化矩阵和变量**

```python
matrix = [[1, 2, 3, 4],
          [5, 6, 7, 8],
          [9, 10, 11, 12]]
```

这是一个 3x4 的二维矩阵矩阵有 3 行和 4 列。接下来,我们会从这个矩阵中按照螺旋顺序读取所有元素。

```python
rows = len(matrix)
cols = len(matrix[0])
```

`rows` 是矩阵的行数,`cols` 是矩阵的列数。这里的 `rows` 为 3,`cols` 为 4。

接下来定义了四个边界:
- `left`: 记录当前遍历区域的最左列
- `right`: 记录当前遍历区域的最右列
- `top`: 记录当前遍历区域的最上行
- `bottom`: 记录当前遍历区域的最下行

初始化时,`left = 0`,`right = cols - 1`(即 3),`top = 0`,`bottom = rows - 1`(即 2)。

```python
result = []
```

`result` 用于存放遍历过程中按照螺旋顺序读取的矩阵元素。

### 2. **开始螺旋遍历**

```python
while left <= right and top <= bottom:
```

`while` 循环的条件确保了只要遍历区域有效(即仍然有元素未被遍历),就会继续执行。直到遍历到所有元素为止。

在每一轮遍历中,按顺时针的顺序从矩阵的四个边界依次读取元素:

#### 2.1 **从左往右遍历**

```python
for col in range(left, right + 1):
    result.append(matrix[top][col])
```

这段代码表示从 `top` 行的 `left` 列到 `right` 列遍历,将每个元素加入 `result`。即遍历当前最上面的一行。

#### 2.2 **从上往下遍历**

```python
for row in range(top + 1, bottom + 1):
    result.append(matrix[row][right])
```

这段代码表示从 `right` 列的 `top + 1` 行到 `bottom` 行遍历,将每个元素加入 `result`。即遍历当前最右面的一列(跳过已经遍历过的最上面一行)。

#### 2.3 **从右往左遍历(仅当有多余行和列时)**

```python
if left < right and top < bottom:
    for col in range(right - 1, left, -1):
        result.append(matrix[bottom][col])
```

这段代码表示从 `bottom` 行的 `right - 1` 列到 `left` 列反向遍历,将每个元素加入 `result`。即遍历当前最下面的一行(跳过已经遍历过的最右边一列)。注意,`if left < right and top < bottom:` 这个条件确保只有当当前行数和列数足够的时候,才进行这一步。如果已经没有剩余的行或列,就不再执行这一步。

#### 2.4 **从下往上遍历(仅当有多余行和列时)**

```python
for row in range(bottom, top, -1):
    result.append(matrix[row][left])
```

这段代码表示从 `bottom` 行的 `left` 列到 `top + 1` 行反向遍历,将每个元素加入 `result`。即遍历当前最左边的一列(跳过已经遍历过的最下面一行)。同样,`if left < right and top < bottom:` 这个条件确保只有在剩余部分足够时才进行这一步。

### 3. **更新边界**

```python
left = left + 1
right = right - 1
top = top + 1
bottom = bottom - 1
```

每完成一轮遍历后,更新矩阵的四个边界:
- `left` 增加 1,意味着左边界右移;
- `right` 减少 1,意味着右边界左移;
- `top` 增加 1,意味着上边界下移;
- `bottom` 减少 1,意味着下边界上移。

### 4. **输出结果**

```python
print(result)
```

最终输出螺旋顺序遍历的结果。

### 5. **整体流程示例**

假设矩阵如下:

```
[[ 1,  2,  3,  4],
 [ 5,  6,  7,  8],
 [ 9, 10, 11, 12]]
```

遍历过程如下:
- 第一轮:从左到右遍历第一行 `[1, 2, 3, 4]`,从上到下遍历最后一列 `[8, 12]`,从右到左遍历最后一行 `[11, 10, 9]`,从下到上遍历第一列 `[5]`。
- 第二轮:从左到右遍历第二行 `[6, 7]`,完成所有元素遍历。

最终 `result` 中的元素是:
```
[1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7]
```

### 6. **总结**

这个算法的核心思路是通过设置四个边界,不断缩小遍历的区域,每次按顺时针方向遍历矩阵的四个边界,直到矩阵所有元素被遍历完。


http://www.ppmy.cn/news/1545537.html

相关文章

qt QShortcut详解

1、概述 QShortcut是Qt框架中的一个类&#xff0c;它提供了一种创建键盘快捷键的方式。通过QShortcut&#xff0c;开发者可以将特定的键盘组合&#xff08;如CtrlC、AltF4等&#xff09;与应用程序中的动作&#xff08;如复制、关闭窗口等&#xff09;关联起来。当用户在应用程…

矩阵的奇异值分解SVD

为了论述矩阵的奇异值与奇异值分解!需要下面的结论!

6款IntelliJ IDEA插件,让Spring和Java开发如虎添翼

文章目录 1、SonarLint2、JRebel for IntelliJ3、SwaggerHub插件4、Lombok插件5、RestfulTool插件6、 Json2Pojo插件7、结论 对于任何Spring Boot开发者来说&#xff0c;两个首要的目标是最大限度地提高工作效率和确保高质量代码。IntelliJ IDEA 是目前最广泛使用的集成开发环境…

计算机网络——TCP篇

TCP篇 基本认知 TCP和UDP的区别? TCP 和 UDP 可以使用同一个端口吗&#xff1f; 可以的 传输层中 TCP 和 UDP在内核中是两个完全独立的软件模块。可以根据协议字段来选择不同的模块来处理。 TCP 连接建立 TCP 三次握手过程是怎样的&#xff1f; 一次握手:客户端发送带有 …

动手学深度学习9.8. 束搜索-笔记练习(PyTorch)

本节课程地址&#xff1a;63 束搜索【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&#xff1a;9.8. 束搜索 — 动手学深度学习 2.0.0 documentation 本节开源代码&#xff1a;...>d2l-zh>pytorch>chapter_multilayer-perceptrons>beam-search.ipynb 束搜…

计算机网络——路由器构成

算路由表是分布式去算——你算你的&#xff0c;我算我的 输出队列非先来先传 调度发生在哪里 缓存队列一般是应对——来数据方向的速度过快问题

Qt自定义控件:汽车速度表

1、功能 制作一个汽车速度表 2、实现 从外到内进行绘制&#xff0c;初始化画布&#xff0c;画渐变色外圈&#xff0c;画刻度&#xff0c;写刻度文字&#xff0c;画指针&#xff0c;画扇形&#xff0c;画内圈渐变色&#xff0c;画黑色内圈&#xff0c;写当前值 3、效果 4、源…

练习LabVIEW第四十四题

学习目标&#xff1a; 计算学生三门课(语文&#xff0c;数学&#xff0c;英语)的平均分&#xff0c;并根据平均分划分成绩等级。要求输出等级A,B,C,D,E。90分以上为A&#xff0c;80&#xff5e;89为B&#xff0c;70&#xff5e;79为C&#xff0c;60&#xff5e;69为D&#xff…