中等
相关标签
相关企业
提示
给你一个 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.lengthn == matrix[i].length1 <= 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;
}