[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的主要内容,如果未能解决你的问题,请参考以下文章