1:算法解析
算法如图,从矩阵的(0,0)开始,向右至此行最右边有效的节点,则向右处理行(最小行号)结束;
从下一行的列节点开始,向下至此列最下边有效的节点,则向下处理列(最大列号)结束;
从此行的左边节点开始,向左至此行最左边有效的节点,则向左处理行(最大行号)结束;
从上一行的行节点开始,向上至此列最上边有效的节点,则向上处理列(最小列号)结束;
若任一个方向没有需要处理的数值,则算法结束,否则修改行或列有效值,继续循环。
2:代码讲解
2.1:无效判断中,matrix的相关判断应该放在行或列的判断之后,不然测试例为[]时,matrix==NULL,*matrix会出现错误。
2.2:为提高程序可读性,用row/col代表有效的最小行号/列号,rows/cols代表有效的最大行号/列号,tmpr/tmpc介于有效最大最小行/列值之间,为赋值所用。
2.3:二层while的条件代表仍有元素需要处理,一旦任意一个二层while的条件无法满足,即达到算法结束条件。
2.4:每个方向处理完之后,下一个方向的处理节点不应该与该方向有重合,即注意每个方向的起始点的行号和列号。
3:详细代码
int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
if (matrixSize <= 0 || matrixColSize == NULL || *matrixColSize <= 0
|| matrix == NULL || *matrix == NULL) {
if (returnSize != NULL)
*returnSize = 0;
return;
}
*returnSize = *matrixColSize*matrixSize;
int* res = (int *)calloc(*returnSize, sizeof(int));
int index = 0;
int rows = matrixSize - 1, cols = *matrixColSize - 1;
int row = 0, col = 0;
int tmpr = row, tmpc = col;
while (1) {
if (tmpc > cols) break;
while (tmpc <= cols) //向右
res[index++] = matrix[row][tmpc++];
tmpr = ++row;
if (tmpr > rows) break;
while (tmpr <= rows) //向下
res[index++] = matrix[tmpr++][cols];
tmpc = --cols;
if (tmpc < col) break;
while (tmpc >= col) //向左
res[index++] = matrix[rows][tmpc--];
tmpr = --rows;
if (tmpr < row) break;
while (tmpr >= row) //向上
res[index++] = matrix[tmpr--][col];
tmpc = ++col;
}
return res;
}