Skip to the content.

Ex29 顺时针打印矩阵

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 1:

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

解题思路

顺时针的四个遍历,以及主要数据。

这道题比较难,需要打个草稿,理一下思路。只看过一遍《剑指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%的用户

备注

Line 207: Char 3: runtime error: load of null pointer of type ‘int’ [Serializer.c]

这是因为当matrix=[],即空时,仍需赋值returnSize。