IList<int> PrintSpiralOrder(int[][] matrix)
{
int hStart = 0;
int hEnd = matrix[0].Length;
int vEnd = matrix.Length;
List<int> ans = new List<int>();
while (hStart < hEnd && hStart < vEnd)
{
for (int i = hStart; i < hEnd; i++)
ans.Add(matrix[hStart][i]);
for (int j = hStart + 1; j < vEnd; j++)
ans.Add(matrix[j][hEnd - 1]);
if (hStart < vEnd - 1)
for (int k = hEnd - 2; k >= hStart; k--)
ans.Add(matrix[vEnd - 1][k]);
if (hStart < hEnd - 1)
for (int l = vEnd - 2; l >= hStart + 1; l--)//1>
ans.Add(matrix[l][hStart]);
hStart++;
hEnd--;
vEnd--;
}
return ans;
}
public class Solution
{
public IList<int> SpiralOrder(int[][] arr)
{
var ls = new List<int>();
var count = 0;
var bol = new bool[arr.Length, arr[0].Length];
int x = 0;
int y = 0;
var r = 0;
while (count < arr.Length * arr[0].Length)
{
// horizontally right
for (int i = 0; i < arr[0].Length - r; i++)
{
if (x < arr[0].Length - r && !bol[y, x])
{
bol[y, x] = true;
ls.Add(arr[y][x++]);
count++;
}
}
y++;
x--;
// vertically down
for (int i = 0; i < arr.Length - r; i++)
{
if (y < arr.Length - r && !bol[y, x])
{
bol[y, x] = true;
ls.Add(arr[y++][x]);
count++;
}
}
x--;
y--;
// horizontally left
for (int i = 0; i < arr[0].Length - r; i++)
{
if (x >= r && !bol[y, x])
{
bol[y, x] = true;
ls.Add(arr[y][x--]);
count++;
}
}
x++;
y--;
// vertically Up
for (int i = 0; i < arr.Length - r; i++)
{
if (y > r && !bol[y, x])
{
bol[y, x] = true;
ls.Add(arr[y--][x]);
count++;
}
}
x++;
y++;
r++;
}
return ls;
}
}
4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16