给定一个包含 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; }