Ex29 顺时针打印矩阵
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
解题思路
顺时针的四个遍历,以及主要数据。
- 初始时,x_start = 0, y_start = 0, x_end = matrixSize, y_end = *matrixColSize;
- 从左向右遍历,遍历完上面一行,++x_start;
- 从上向下遍历,遍历完右边一列,–y_end;
- 从右向左遍历,遍历完下面一行,–x_end;
- 从下向上遍历,遍历完左边一列,++y_start;
- 循环终止条件,index > *returnSize-1,其中index是返回数组的index,也是已经遍历过的数字的个数;returnSize是所有的数据的个数。
这道题比较难,需要打个草稿,理一下思路。只看过一遍《剑指Offer》上的解法还不行,一般只做一遍估摸着还是很难第二遍仍然快速做出来的。
代码
int *
spiralOrder (int **matrix, int matrixSize, int *matrixColSize, int *returnSize)
{
if (!matrix || matrixSize <= 0 || *matrixColSize <= 0) {
*returnSize = 0;
return NULL;
}
*returnSize = matrixSize * *matrixColSize;
int *res = (int *)malloc (sizeof (int) * *returnSize);
int x_start = 0, y_start = 0, x_end = matrixSize, y_end = *matrixColSize;
int index = 0;
while (index <= *returnSize - 1)
{
// left-->right
int y = y_start;
while (y < y_end && index <= *returnSize - 1)
{
// printf ("first: %d %d\n", x_start, y);
res[index] = matrix[x_start][y];
++y;
++index;
}
++x_start;
// up-->down
int x = x_start;
while (x < x_end && index <= *returnSize - 1)
{
// printf ("second: %d %d\n", x, y_end - 1);
res[index] = matrix[x][y_end - 1];
++x;
++index;
}
--y_end;
// right-->left
y = y_end - 1;
while (y >= y_start && index <= *returnSize - 1)
{
// printf ("third: %d %d\n", x_end - 1, y);
res[index] = matrix[x_end - 1][y];
--y;
++index;
}
--x_end;
// down-->up
x = x_end - 1;
while (x >= x_start && index <= *returnSize - 1)
{
// printf ("fourth: %d %d\n", x, y_start);
res[index] = matrix[x][y_start];
--x;
++index;
}
++y_start;
}
return res;
}
结果
执行结果:通过
执行用时:44 ms, 在所有 C 提交中击败了82.69%的用户
内存消耗:9.3 MB, 在所有 C 提交中击败了11.11%的用户
备注
- 错误1,参见Ex4的备注
- 错误2
Line 207: Char 3: runtime error: load of null pointer of type ‘int’ [Serializer.c]
这是因为当matrix=[],即空时,仍需赋值returnSize。