【LeetCode 面试经典150题】54. Spiral Matrix 螺旋矩阵

本文介绍了一种解决给定矩阵螺旋顺序遍历问题的算法,通过模拟从左上角出发,按右、下、左、上四个方向移动,同时标记已访问元素的方法,最终返回矩阵的所有元素序列。
摘要由CSDN通过智能技术生成

54. Spiral Matrix

题目大意

Given an m x n matrix, return all elements of the matrix in spiral order.

中文释义

给定一个 m x n 的矩阵,按螺旋顺序返回矩阵中的所有元素。

示例

  1. 示例 1:
    在这里插入图片描述

    • 输入: matrix = [[1,2,3],[4,5,6],[7,8,9]]
    • 输出: [1,2,3,6,9,8,7,4,5]
  2. 示例 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

解题思路

方法:模拟螺旋遍历

思路

这个解法通过模拟螺旋路径来遍历矩阵。它从矩阵的左上角开始,按照右、下、左、上的顺序遍历矩阵,并在每个方向上移动直到边界或遇到已访问的元素。为了标记已访问的元素,使用特殊值 -200

算法步骤

  1. 初始化变量:初始化行索引 index_i,列索引 index_j,行边界 edge_i,列边界 edge_j,以及结果向量 ans。设置 totalCnt 为矩阵中元素总数。

  2. 螺旋遍历:当还有未访问的元素时(即 totalCnt 大于 0),按照以下步骤遍历:

    • 向右移动:当可以向右移动时(即下一个元素未被访问),更新 index_j,将当前元素添加到结果中,并将其标记为已访问。
    • 向下移动:同上,更新 index_i,向下移动。
    • 向左移动:同上,更新 index_j,向左移动。
    • 向上移动:同上,更新 index_i,向上移动。
  3. 返回结果:当遍历完所有元素后,返回结果向量 ans

代码实现

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int index_i = 0, index_j = -1, edge_i = matrix.size(), edge_j = matrix[0].size();
        vector<int> ans;
        int totalCnt = edge_i * edge_j;
        while (totalCnt) {
            // 向右移动
            while (totalCnt > 0 && index_j + 1 < edge_j && matrix[index_i][index_j + 1] != -200) {
                index_j++;
                ans.push_back(matrix[index_i][index_j]);
                matrix[index_i][index_j] = -200;
                totalCnt--;
            }
            // 向下移动
            while (totalCnt > 0 && index_i + 1 < edge_i && matrix[index_i + 1][index_j] != -200) {
                index_i++;
                ans.push_back(matrix[index_i][index_j]);
                matrix[index_i][index_j] = -200;
                totalCnt--;
            }
            // 向左移动
            while (totalCnt > 0 && index_j - 1 >= 0 && matrix[index_i][index_j - 1] != -200) {
                index_j--;
                ans.push_back(matrix[index_i][index_j]);
                matrix[index_i][index_j] = -200;
                totalCnt--;
            }
            // 向上移动
            while (totalCnt > 0 && index_i - 1 >= 0 && matrix[index_i - 1][index_j] != -200) {
                index_i--;
                ans.push_back(matrix[index_i][index_j]);
                matrix[index_i][index_j] = -200;
                totalCnt--;
            }
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值