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

C++算法练习-day5——59.螺旋矩阵2

题目来源:. - 力扣(LeetCode)

题目思路分析

给定一个整数 n,要求生成一个 n x n 的矩阵,其中的元素按螺旋顺序排列,从矩阵的左上角开始,向右、向下、向左、向上依次填充,直到所有元素都被填充完毕。

这个问题可以通过模拟螺旋填充的过程来解决。我们可以使用四个变量来跟踪当前要填充的边界:s(上边界),x(下边界),z(左边界),y(右边界)。初始时,这四个变量分别设置为 0、n-1、0、n-1,表示整个矩阵的范围。然后,我们按照右、下、左、上的顺序填充矩阵,每次填充完一条边后,相应地更新边界变量,直到所有元素都被填充完毕。

代码实例及注解

实例:

#include <vector>  class Solution {  
public:  std::vector<std::vector<int>> generateMatrix(int n) {  // 创建一个 n x n 的矩阵,并初始化为 0  std::vector<std::vector<int>> ans(n, std::vector<int>(n, 0));  // 定义四个边界变量  int s = 0; // 上边界  int x = n - 1; // 下边界  int z = 0; // 左边界  int y = n - 1; // 右边界  // 当前要填充的数字,从 1 开始  int num = 1;  // 当还有元素未填充完毕时,继续循环  while (num <= n * n) {  // 从左到右填充上边  for (int i = z; i <= y; i++, num++) {  ans[s][i] = num;  }  s++; // 上边界下移  // 从上到下填充右边  for (int i = s; i <= x; i++, num++) {  ans[i][y] = num;  }  y--; // 右边界左移  // 注意:如果只剩下一行或一列未填充,上面的两个循环会正确地处理这种情况,  // 因为当 s == x 或 z == y 时,相应的循环体将不会执行任何操作。  // 从右到左填充下边(如果还有未填充的行)  if (s <= x) { // 检查是否还有未填充的行  for (int i = y; i >= z; i--, num++) {  ans[x][i] = num;  }  x--; // 下边界上移  }  // 从下到上填充左边(如果还有未填充的列)  if (z <= y) { // 检查是否还有未填充的列  for (int i = x; i >= s; i--, num++) {  ans[i][z] = num;  }  z++; // 左边界右移  }  }  return ans;  }  
};

注解

  • std::vector<std::vector<int>> ans(n, std::vector<int>(n, 0));:创建一个 n x n 的矩阵,并初始化为 0。
  • int s = 0, x = n - 1, z = 0, y = n - 1;:定义四个边界变量,分别表示上、下、左、右边界。
  • int num = 1;:当前要填充的数字,从 1 开始。
  • while (num <= n * n):当还有元素未填充完毕时,继续循环。
  • for (int i = z; i <= y; i++, num++) { ans[s][i] = num; }:从左到右填充上边。
  • s++;:上边界下移。
  • for (int i = s; i <= x; i++, num++) { ans[i][y] = num; }:从上到下填充右边。
  • y--;:右边界左移。
  • if (s <= x) { ... } 和 if (z <= y) { ... }:这两个条件判断是为了处理在填充过程中可能出现的只剩下一行或一列未填充的情况。
  • for (int i = y; i >= z; i--, num++) { ans[x][i] = num; }:从右到左填充下边(如果还有未填充的行)。
  • x--;:下边界上移。
  • for (int i = x; i >= s; i--, num++) { ans[i][z] = num; }:从下到上填充左边(如果还有未填充的列)。
  • z++;:左边界右移。

知识点摘要

  1. 矩阵初始化:在 C++ 中,可以使用嵌套的 std::vector 来创建二维矩阵,并通过构造函数将其初始化为特定值。

  2. 边界变量:在处理螺旋填充等问题时,使用边界变量来跟踪当前要处理的区域是一个有效的方法。

  3. 循环控制:通过合理的循环控制和条件判断,可以确保每个元素都被正确地填充到矩阵中。

  4. 算法的时间复杂度:该算法的时间复杂度为 O(n2),用于存储生成的矩阵。

通过本文的讲解和代码实例,相信读者已经对如何生成按螺旋顺序排列的矩阵有了更深入的理解。


http://www.mrgr.cn/news/52712.html

相关文章:

  • MOE论文详解(4)-GLaM
  • 科学家们设计了一种新型胰岛素,能够根据血液中的葡萄糖水平自动开启或关闭
  • 985研一学习日记 - 2024.10.16
  • ClaimsettlementController
  • Linux的开发工具gcc Makefile gdb的学习
  • 新型扩散模型加速框架Hyper-sd分享
  • SQL Injection | SQL 注入 —— 时间盲注
  • 如何正确并优雅的使用Java中的临时文件目录
  • DeBiFormer:带有可变形代理双层路由注意力的视觉Transformer
  • vue + 百度地图GL版实现点聚合
  • C++算法练习-day6——203.移除链表元素
  • flask-socketio-+Nginx反向代理在消息收发和提醒上在使用
  • Scala的fold
  • 思想实验思维浅谈
  • GEE python: RUSLE土壤侵蚀模型的代码
  • 《深度学习》Dlib、OpenCV 轮廓绘制
  • snmpgetnext使用说明
  • STM32+PWM+DMA驱动WS2812
  • C语言 | Leetcode C语言题解之第491题非递减子序列
  • 苹果首部VR电影:《Submerged》的背后故事与沉浸式电影的未来