[Leetcode] Rotate Image

Posted seako

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Leetcode] Rotate Image相关的知识,希望对你有一定的参考价值。

 

 

思考方式是是這樣,如果有個3x3的二維陣列

1 2 3

4 5 6

7 8 9

以1到9以對線為中心交換,變成

1 4 7

2 5 6

3 8 9

在以5為中心交換

1 4 7

2 5 8

3 6 9

在轉換column的位置

7 4 1

8 5 2

9 6 3

就完成轉置了

因為c#這題的參數是 int[][],也就是

陣列0是 1 4 7組成

陣列1是 2 5 8組成

陣列2是 3 6 9組成

在轉換column位置的時候,要完成陣列0 1 2內的數值調換,還是跑二個for迴圈

就想說如果從3到7的對角線調換,變成

9 6 3

8 5 2

7 4 1

這樣只要用一個一維陣列暫存,直接調換整個一維陣列,一個迴圈完成工作

從右上到左下的調換比較麻煩,不像左上到右下直覺

以index的x,y坐標來考慮

00 01 02

10 11 12

20 21 22

row的 x是固定的,y是遞增

column 的y 是固定的,x是遞減

(因為00 跟22調換,01跟12調換)

 

第一個迴圈會跑右上左下對角線,xy分別是 02 11 20

//外層固定的y
int y = matrixLength ;
//外層固定的x
int x = 0;

for (; y >= 0; y--,x++)

iy ix 分別代表會 遞增的y 及 遞減的x

所以 在02點 可以透過 [x][iy] 取得 00 01,[ix][y]取得22 12 進行調換

           //內層固定的y
            int iy;
            //內層固定的x
            int ix;

            for (; y >= 0; y--,x++)
            {
                iy = 0;
                ix = matrixLength;
                for(int counter = 0; counter < y;counter++,iy++,ix--)

 像這樣

調換完成後,

9 6 3

8 5 2

7 4 1

 

9 6 3 跟 741 調換就完成

如果是 4 x 4

row1 16 12 08 04

row2 15 11 07 03

row3 14 10 06 02

row4 13 09 05 01

 

row1 跟row4調換,row2跟row3調換

 

完整程式碼

   public class Solution
    {
        public void Rotate(int[][] matrix)
        {
            int temp;
            int matrixLength = matrix[0].Length -1;


            //外層固定的y
            int y = matrixLength ;
            //外層固定的x
            int x = 0;

            //內層固定的y
            int iy;
            //內層固定的x
            int ix;

            for (; y >= 0; y--,x++)
            {
                iy = 0;
                ix = matrixLength;
                for(int counter = 0; counter < y;counter++,iy++,ix--)
                {
                    temp = matrix[x][iy];
                    matrix[x][iy] = matrix[ix][y];
                    matrix[ix][y] = temp;
                }
            }

            int[] tar;
            for (int i = 0, j = matrixLength; i <=j; i++, j--)
            {
                tar = matrix[i];
                matrix[i] = matrix[j];
                matrix[j] = tar;
            }

            tar = null;
        }
    }

 

 

以上是关于[Leetcode] Rotate Image的主要内容,如果未能解决你的问题,请参考以下文章

[leetcode]48. Rotate Image

LeetCode: 48. Rotate Image

一天一道LeetCode#48. Rotate Image

LeetCode.48 - Rotate Image

LeetCode048. Rotate Image

LeetCode矩阵旋转Rotate Image