算法练习-螺旋矩阵(思路+流程图+代码)

难度参考

难度:中等

分类:数组

难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。以下内容均为个人笔记,旨在督促自己认真学习。

题目

给定一个正整数n,生成一个包含1到 n^2 所有元素,且元素按【顺时针】顺序螺旋排列的正方形矩阵。

示例1:

输入:n=3

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

思路

题目要求生成一个顺时针螺旋排列的正方形矩阵,矩阵元素从1到n^2逐个递增。

  1. 初始化矩阵: 创建一个大小为n×n的矩阵,初始化所有元素为0。

  2. 定义边界: 使用四个变量topbottomleftright表示当前螺旋的边界。

  3. 顺时针填充矩阵: 使用循环,按照从左到右、从上到下、从右到左、从下到上的顺序填充矩阵。

  4. 更新边界: 每填充完一个方向后,更新相应的边界,确保下一轮填充在新的边界内进行。

  5. 重复步骤3和4: 循环执行步骤3和4,直到矩阵填充完成。

示例

考虑n=3的情况,即生成一个3×3的螺旋矩阵。

1.初始化矩阵:matrix = [[0, 0, 0], [0, 0, 0], [0, 0, 0]],

复制代码
matrix = [
  [0, 0, 0],
  [0, 0, 0],
  [0, 0, 0]
]

初始边界:top=0, bottom=2, left=0, right=2。

2.从左到右:matrix[0][0]=1, matrix[0][1]=2, matrix[0][2]=3

复制代码
matrix = [
  [1, 2, 3],
  [0, 0, 0],
  [0, 0, 0]
]

更新top=1,

此时,top=1, bottom=2, left=0, right=2。

3.从上到下:matrix[1][2]=6, matrix[2][2]=9

复制代码
matrix = [
  [1, 2, 3],
  [0, 0, 4],
  [0, 0, 5]
]

更新right=1,

此时,top=1, bottom=2, left=0, right=1。

4.从右到左:matrix[2][1]=8, matrix[2][0]=7

复制代码
matrix = [
  [1, 2, 3],
  [0, 0, 4],
  [7, 6, 5]
]

更新bottom=1,

此时,top=1, bottom=1, left=0, right=1。

5.从下到上:matrix[1][0]=4

复制代码
matrix = [
  [1, 2, 3],
  [8, 9, 4],
  [7, 6, 5]
]

更新left=1,

此时,top=1, bottom=1, left=1, right=1。

在每个方向上填充完后,我们更新相应的边界,并按照新的边界进行下一个方向的填充。这样,直到矩阵被填充完成。

梳理

本题主要逻辑是生成一个顺时针螺旋矩阵,其本质是通过模拟顺时针填充矩阵的过程。

  1. 初始化矩阵和边界指针:

    • 创建一个大小为 n x n 的矩阵,所有元素初始化为0。
    • 初始化四个指针 topbottomleftright 分别表示矩阵的上、下、左、右边界。
    • 初始化 num 用于填充矩阵的数字。
  2. 循环填充矩阵:

    • 在满足循环条件的情况下,按照顺时针的顺序从左到右、从上到下、从右到左、从下到上依次填充矩阵。
    • 在每个方向上,通过循环将 num 递增并填充到相应的位置。
  3. 逐步调整边界指针:

    • 每填充完一个方向后,逐步调整边界指针,确保下一次填充的方向不会重叠。
  4. 返回生成的矩阵:

    • 循环结束后,生成的矩阵即为顺时针螺旋矩阵。

本质上,这段代码通过模拟顺时针填充矩阵的过程,利用循环和边界指针的调整,逐步生成顺时针螺旋矩阵。这是一种常见的矩阵操作,通过巧妙的控制循环和边界指针,实现了一个相对简洁而高效的算法。

代码

复制代码
#include <iostream>
#include <vector>

using namespace std;

// 生成顺时针螺旋矩阵
vector<vector<int>> generateMatrix(int n) {
    // 初始化矩阵
    vector<vector<int>> matrix(n, vector<int>(n, 0));

    // 设置边界指针
    int top = 0, bottom = n - 1, left = 0, right = n - 1;
    int num = 1; // 用于填充矩阵的数字

    // 循环填充矩阵
    while (top <= bottom && left <= right) {
        // 从左到右
        for (int i = left; i <= right; ++i) {
            matrix[top][i] = num++;
        }
        top++;

        // 从上到下
        for (int i = top; i <= bottom; ++i) {
            matrix[i][right] = num++;
        }
        right--;

        // 从右到左
        if (top <= bottom) {
            for (int i = right; i >= left; --i) {
                matrix[bottom][i] = num++;
            }
            bottom--;
        }

        // 从下到上
        if (left <= right) {
            for (int i = bottom; i >= top; --i) {
                matrix[i][left] = num++;
            }
            left++;
        }
    }

    return matrix;
}

// 辅助函数:打印矩阵
void printMatrix(const vector<vector<int>>& matrix) {
    for (const auto& row : matrix) {
        for (int num : row) {
            cout << num << " ";
        }
        cout << endl;
    }
}

int main() {
    int n = 3;
    
    // 生成螺旋矩阵
    vector<vector<int>> result = generateMatrix(n);

    cout << "生成的螺旋矩阵:" << endl;
    
    // 打印矩阵
    printMatrix(result);

    return 0;
}

时间复杂度:O(n^2)模拟过程相当于遍历了一遍二维矩阵。

空间复杂度:O(1)

打卡

相关推荐
GIS学姐嘉欣19 小时前
常见二三维GIS数据分类及处理流程图
流程图·gis·webgis
qiaochuanbiao2 天前
三种方式修改AI生成的流程图,实现无损放大
流程图
GIS开发特训营9 天前
常见二三维GIS数据分类及处理流程图
学习·流程图·gis·gis开发·webgis
JZC_xiaozhong16 天前
OA 审批流与业务流程引擎区别:企业流程自动化进阶
运维·自动化·流程图·bpm·业务流程管理·流程设计可视化·流程监控
杨筱毅18 天前
【Android】Handler/Looper机制相关的类图和流程图
android·java·流程图
时光追逐者19 天前
一个使用 WPF 开发的 Diagram 画板工具(包含流程图FlowChart,思维导图MindEditor)
c#·.net·wpf·流程图
helloworddm19 天前
Orleans 流系统握手机制流程图
流程图
做科研的周师兄24 天前
【机器学习入门】8.2 主成分分析:一文吃透主成分分析(PCA)—— 从原理到核心逻辑
人工智能·算法·决策树·机器学习·流程图
做科研的周师兄1 个月前
【机器学习入门】7.1 决策树 —— 像 “判断流程图” 一样做分类
决策树·机器学习·流程图
东风西巷1 个月前
draw.io(免费流程图制作工具) 中文绿色版
学习·电脑·流程图·软件需求·draw.io