54.螺旋矩阵

  1. 54.螺旋矩阵
    1. 54.1 题目
    2. 54.2 题解
      1. 逐层模拟
    3. 54.3 代码
    4. 54.4 运行结果

54.螺旋矩阵


54.1 题目

给你一个 mn 列的矩阵 matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:


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

示例 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

54.2 题解

逐层模拟

// 方法一:逐层模拟
// 把矩阵看做是由n层矩形构成的,我们可以一层一层的按顺时针打印他们,直到把最内层打印完毕。
// 就是一圈一圈打印,逐渐缩小圈,直至最内圈打印完
static IList<int> SpiralOrder1(int[][] matrix)
{
    // 检查输入矩阵是否为空或维度为零,如果是,则返回空列表
    if (matrix == null || matrix.GetLength(0) == 0 || matrix[0].Length == 0)
        return new List<int>();

    // 获取矩阵的行数和列数
    int rows = matrix.GetLength(0);
    int cols = matrix[0].Length;

    // 初始化边界指示器
    int top = 0;
    int bottom = rows - 1;
    int left = 0;
    int right = cols - 1;

    // 用于存储结果的列表
    List<int> result = new List<int>();

    // 循环遍历矩阵,按螺旋顺序添加元素到结果列表
    while (top <= bottom && left <= right)
    {
        // 从左到右遍历并添加元素到结果列表
        for (int col = left; col <= right; col++)
        {
            result.Add(matrix[top][col]);
        }

        // 从上到下遍历并添加元素到结果列表
        for (int row = top + 1; row <= bottom; row++)
        {
            result.Add(matrix[row][right]);
        }

        // 检查是否有足够的行和列使得可以从右到左遍历
        if (left < right && top < bottom)
        {
            // 从右到左遍历并添加元素到结果列表
            for (int col = right - 1; col >= left; col--)
            {
                result.Add(matrix[bottom][col]);
            }

            // 从下到上遍历并添加元素到结果列表
            for (int row = bottom - 1; row > top; row--)
            {
                result.Add(matrix[row][left]);
            }
        }

        // 更新边界指示器,缩小螺旋范围
        top++;
        bottom--;
        left++;
        right--;
    }

    // 返回最终结果列表
    return result;
}

54.3 代码

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        #region 题目

        // 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

        // 示例 1:
        // 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
        // 输出:[1,2,3,6,9,8,7,4,5]

        // 示例 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

        #endregion

        #region 测试

        // 示例 1
        int[][] matrix1 = new int[][]
        {
            new int[] { 1, 2, 3 },
            new int[] { 4, 5, 6 },
            new int[] { 7, 8, 9 }
        };
        IList<int> result1 = SpiralOrder1(matrix1);
        Console.WriteLine($"示例1 方法1 输出:{string.Join(", ", result1)}");

        // 示例 2
        int[][] matrix2 = new int[][]
        {
            new int[] { 1, 2, 3, 4 },
            new int[] { 5, 6, 7, 8 },
            new int[] { 9, 10, 11, 12 }
        };
        IList<int> result2 = SpiralOrder1(matrix2);
        Console.WriteLine($"示例2 方法1 输出:{string.Join(", ", result2)}");

        #endregion
    }

    #region 答案

    // 方法一:逐层模拟
    // 把矩阵看做是由n层矩形构成的,我们可以一层一层的按顺时针打印他们,直到把最内层打印完毕。
    // 就是一圈一圈打印,逐渐缩小圈,直至最内圈打印完
    static IList<int> SpiralOrder1(int[][] matrix)
    {
        // 检查输入矩阵是否为空或维度为零,如果是,则返回空列表
        if (matrix == null || matrix.GetLength(0) == 0 || matrix[0].Length == 0)
            return new List<int>();

        // 获取矩阵的行数和列数
        int rows = matrix.GetLength(0);
        int cols = matrix[0].Length;

        // 初始化边界指示器
        int top = 0;
        int bottom = rows - 1;
        int left = 0;
        int right = cols - 1;

        // 用于存储结果的列表
        List<int> result = new List<int>();

        // 循环遍历矩阵,按螺旋顺序添加元素到结果列表
        while (top <= bottom && left <= right)
        {
            // 从左到右遍历并添加元素到结果列表
            for (int col = left; col <= right; col++)
            {
                result.Add(matrix[top][col]);
            }

            // 从上到下遍历并添加元素到结果列表
            for (int row = top + 1; row <= bottom; row++)
            {
                result.Add(matrix[row][right]);
            }

            // 检查是否有足够的行和列使得可以从右到左遍历
            if (left < right && top < bottom)
            {
                // 从右到左遍历并添加元素到结果列表
                for (int col = right - 1; col >= left; col--)
                {
                    result.Add(matrix[bottom][col]);
                }

                // 从下到上遍历并添加元素到结果列表
                for (int row = bottom - 1; row > top; row--)
                {
                    result.Add(matrix[row][left]);
                }
            }

            // 更新边界指示器,缩小螺旋范围
            top++;
            bottom--;
            left++;
            right--;
        }

        // 返回最终结果列表
        return result;
    }

    #endregion
}

54.4 运行结果

示例1 方法1 输出:1, 2, 3, 6, 9, 8, 7, 4, 5
示例2 方法1 输出:1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏