54. 螺旋矩阵

40 阅读1分钟

54. 螺旋矩阵

中等

相关标签

premium lock icon相关企业

提示

给你一个 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

题解:

借助loop变量来进行每圈的循环,每圈的四条边都采用左闭右开,在记事本中写出四个顶点用loop表示的表达式,用这样的表达式来写循环边界。

(-1 + loop, -1 + loop)                         (-1 + loop, n - loop)








(m - loop, -1 + loop)                           (m - loop, n - loop)

使用不同类型组合的m和n,发现只有当m == n且为奇数时候,最中间的值不会被输出,所以后面加入一个补充的判定。

#include <stdio.h>
#include <stdlib.h>

int min(int a, int b)
{
    return a <= b?a:b;
}

int main()
{
    int m, n, sumloop, minside, i, j, loop, out = 0;
    scanf("%d %d", &m, &n);
    minside = min(m, n);
    sumloop = (minside + 1) / 2;
    int* ans = (int*)malloc(sizeof(int) * m * n);
    int** matrix = (int**)malloc(sizeof(int*) * m);
    for (i = 0;i <= m - 1;i ++)
    {
        matrix[i] = (int*)malloc(sizeof(int) * n);
    }

    for (i = 0;i <= m - 1;i ++)
    {
        for (j = 0;j <= n - 1;j ++)
        {
            scanf("%d", &matrix[i][j]);
        }
    }

    for (loop = 1;loop <= sumloop;loop ++)
    {
        for (j = -1 + loop;j <= n - loop - 1;j ++)
        {
            ans[out] = matrix[-1 + loop][j];
            out ++;
        }

        for (i = -1 + loop;i <= m - loop - 1;i ++)
        {
            ans[out] = matrix[i][n - loop];
            out ++;
        }

        for (j = n - loop;j >= loop;j --)
        {
            ans[out] = matrix[m - loop][j];
            out ++;
        }

        for (i = m - loop;i >= loop;i --)
        {
            ans[out] = matrix[i][loop - 1];
            out ++;
        }
    }
    //特殊情况处理
    if (m == n && m % 2 == 1)
    {
        ans[out] = matrix[m / 2][m / 2];
        out ++;
    }

    for (i = 0;i <= m * n - 1;i ++)
    {
        printf("%d ", ans[i]);
    }
    return 0;
}