LeetCode中等: 旋转图像

做~自己de王妃 提交于 2020-03-12 08:52:52

LeetCode中等: 旋转图像(C#)

题目描述:给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

思路:假设我们现在有一个4 * 4的矩阵,那么直观的来看就是需要将1移动到4,4移动到16,16移动到13,13移动到1,可以简单的表示为1-4-16-13-1。同理还有2-8-15-8-2,5-3-12-14-5以及6-7-11-10-6。可以得出结论,需要关心的区域为黄色框中的数字,只需要遍历黄色区域中的数字,再按照上述顺序移动数字即可。对于偶数阶矩阵,黄色区域应当为将整个矩阵四分之后的左上角区域,即(矩阵阶数 / 2) * (矩阵阶数 / 2)。
在这里插入图片描述
值得注意的地方是对于一个奇数阶矩阵而言,黄色部分应当如下图所示,即(矩阵阶数 / 2+1)*(矩阵阶数/2)。
在这里插入图片描述
ok,再有以上思路之后,我们需要考虑的是如何去移动数字。将移动到的位置记为(next_i,next_j),当前位置记为(current_i,current_j),可以发现next_i = current_j以及next_j = length - 1 - current_i,这里的length指的是矩阵的阶数。

上代码:

public void Rotate(int[][] matrix) {
    int length = matrix[0].Length;
    int row_limit = length % 2 == 0 ?length/2: length / 2 + 1;
    int column_limit = length / 2;
    for (int i = 0; i < row_limit; i++)
    {
        for (int j = 0; j < column_limit; j++)
        {
            int temp1 = 0;
            int temp2 = matrix[i][j];
            int current_i = i;
            int current_j = j;
            for (int k = 0; k < 3; k++)
            {
                int next_i = current_j;
                int next_j = length - 1 - current_i;
                if (k != 0)
                    temp2 = temp1;
                temp1 = matrix[next_i][next_j];
                matrix[next_i][next_j] = temp2;
                current_i = next_i;
                current_j = next_j;
            }
            matrix[i][j] = temp1;
        }
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!