欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > 41 螺旋矩阵

41 螺旋矩阵

2025/4/29 9:43:10 来源:https://blog.csdn.net/weixin_47521269/article/details/144365725  浏览:    关键词:41 螺旋矩阵

41 螺旋矩阵

在这里插入图片描述

41.1 螺旋矩阵解决方案

解决思路

  • 定义边界:首先定义四个边界:上、下、左、右,这些边界帮我限制矩阵的访问范围,初始时。边界的值分别是:上 = 0下 = m -1(矩阵行数-1)左 = 0,右 = n - 1(矩阵列数 -1).
  • 螺旋顺序访问:遍历矩阵时,从左到右遍历上边界,遍历完后将上边界向下移动。然后从上到下遍历右边界,遍历完后将右边界向左移动。接着从右到左遍历下边界,遍历完后将下边界向上移动。最后从下到上遍历左边界,遍历完后将左边界向右移动。
  • 终止条件:当所有边界都已经被访问过时,遍历结束。
class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> result;// 获取矩阵的行数 m 和列数 nint m = matrix.size();int n = matrix[0].size();// 定义四个边界int top = 0, bottom = m - 1, left = 0,right = n - 1;// 循环遍历矩阵,直到所有元素都访问过while(top <= bottom && left <= right){// 从左到右遍历上边界for (int i = left; i <= right; ++i){result.push_back(matrix[top][i]);}top++; // 上边界下移// 从上到下遍历右边界for(int i = top; i <= bottom; ++i){result.push_back(matrix[i][right]);}right--; // 下边界上移}// 确保我们没有越界,处理左边界if(left <= right){for(int i = bottom; i >= top;--i){result.push_back(matrix[i][left]);}left++;// 左边界右移}return result;}
};

代码详解

  • 初始化矩阵大小m = matrix.size()获取矩阵的行数,n = matrix[0].size()获取矩阵的列数。
  • 定义边界:初始化四个边界top,bottom,left,right分别为矩阵的最上面、最下面、最左边和最右边的索引。
  • 螺旋顺序遍历
    • 首先遍历上边界,从左到右访问元素,然后移动上边界。
    • 然后遍历右边界,从上到小访问元素,右边界左移。
    • 接着遍历下边界,从右到左访问元素,下边界上移。
    • 最后遍历左边界,从下到上访问元素,左边界右移。
  • 终止条件:当 top > bottom或者left > right时,说明所有元素都已经遍历完。

41.2 举例说明

输入:

matrix = {{1,2,3},{4,5,6},{7,8,9}};

遍历过程

  • 初始时,top = 0, bottom = 2, left = 0, right = 2。
  • 遍历上边界,元素为 1, 2, 3,top 变为 1。
  • 遍历右边界,元素为 6, 9,right 变为 1。
  • 遍历下边界,元素为 8, 7,bottom 变为 1。
  • 遍历左边界,元素为 4,left 变为 1。

最终输出结果为:[1, 2, 3, 6, 9, 8, 7, 4, 5]。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词