螺旋矩阵

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

首页 我的博客
粤ICP备17103704号