给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1: 输入:[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5]
示例 2: 输入:[ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出: [1,2,3,4,8,12,11,10,9,5,6,7]
//硬推着写的......
public IList<int> SpiralOrder(int[,] matrix)
{
int yLength = matrix.GetLength(0);
int xLength = matrix.GetLength(1);
bool isX = true;//标识符 是X方向还是Y方向
int xDir = 1;//x和y也分正负方向
int yDir = 1;
int x = 0;//这个是表明当前的位置
int y = 0;
int turnXLeft = 0;//上下左右的偏移,遍历过的就不能再去了
int turnXRight = 0;
int turnYUp = 0;
int turnYDown = 0;
IList<int> res = new List<int>();
for (int i = 0; i < matrix.Length; i++)
{
//这里遍历完所有元素
if (isX)
{
res.Add(matrix[y, x]);
x += xDir;
//边界判定
if (x < 0 + turnXLeft || x == xLength - turnXRight)
{
if (x < 0 + turnXLeft)
{
x = 0 + turnXLeft;
}
else
{
x = xLength - turnXRight - 1;
}
isX = false;//变换标志
if (xDir > 0)
{
y += 1;
turnYUp += 1;
}
else
{
y -= 1;
turnYDown += 1;
}
xDir = xDir == 1 ? -1 : 1;//变换方向
}
}
else
{
res.Add(matrix[y, x]);
y += yDir;
if (y < 0 + turnYUp || y == yLength - turnYDown)
{
if (y < 0 + turnYUp)
{
y = 0 + turnYUp;
}
else
{
y = yLength - turnYDown - 1;
}
isX = true;
if (yDir > 0)
{
x -= 1;
turnXRight += 1;
}
else
{
x += 1;
turnXLeft += 1;
}
yDir = yDir == 1 ? -1 : 1;
}
}
}
return res;
}public IList<int> SpiralOrder(int[,] matrix)
{
List<int> Ls = new List<int>();
//4个边界
int top = 0;
int bottom = matrix.GetLength(0) - 1;
int left = 0;
int right = matrix.GetLength(1) - 1;
while (true)//运行一次就是一圈
{
//从左往右
for (int i = left; i <= right; i++) Ls.Add(matrix[top, i]);
top++;
if (left > right || top > bottom) break;
//从上到下
for (int i = top; i <= bottom; i++) Ls.Add(matrix[i, right]);
right--;
if (left > right || top > bottom) break;
//从右到左
for (int i = right; i >= left; i--) Ls.Add(matrix[bottom, i]);
bottom--;
if (left > right || top > bottom) break;
//从下到上
for (int i = bottom; i >= top; i--) Ls.Add(matrix[i, left]);
left++;
if (left > right || top > bottom) break;
}
return Ls;
}