LeetCode Online Judge 题目C# 练习 - Sprial Matrix

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

For example,

Given the following matrix:

[

[ 1, 2, 3 ],

[ 4, 5, 6 ],

[ 7, 8, 9 ]

]

You should return [1,2,3,6,9,8,7,4,5].

 1         public static List<int> SprialMatrix(List<List<int>> matrix)
 2         {
 3             if (matrix.Count == 0)
 4                 return null;
 5 
 6             int m = matrix.Count - 1;
 7             int n = matrix[0].Count - 1;
 8 
 9             List<int> ret = new List<int>();
10             //one row
11             if (m == 0)
12             {
13                 return matrix[0];
14             }
15             //one column
16             if (n == 0)
17             {
18                 for (int i = 0; i <= m; i++)
19                 {
20                     ret.Add(matrix[i][0]);
21                 }
22                 return ret;
23             }
24 
25             for (int i = 0; i <= (Math.Min(m ,n)) / 2; i++)
26             {
27                 for (int col = i; col <= n - i; col++)
28                 {
29                     ret.Add(matrix[i][col]);
30                 }
31                 for (int row = i + 1; row <= m - i; row++)
32                 {
33                     ret.Add(matrix[row][n - i]);
34                 }
35                 if (m - i > i)
36                 {
37                     for (int col = n - i - 1; col >= i; col--)
38                     {
39                         ret.Add(matrix[m - i][col]);
40                     }
41                 }
42                 if (n - i > i)
43                 {
44                     for (int row = m - i - 1; row > i; row--)
45                     {
46                         ret.Add(matrix[row][i]);
47                     }
48                 }
49             }
50 
51             return ret;
52         }

代码分析:

  就是Amazon电面我的题,当时弱爆的我只是瞎写一通。虽然现在还是弱爆,但是,应该能跌跌撞撞写出来。

  两个corner case. 只有一行,只有一列。

  分四部分打印一个环。上行,右列,下行,左列,打印下行,左列的时候要判断还有没有东西,不然会重复打印了上行和右列。