LeetCode 解答 #48. Rotate Image プログラミング練習

問題:
f:id:stlisacity:20180621232033p:plain
難易度: medium
入力:  int型Array
目的: 入力されたn*nのArrayを右に90度回転せよ
出力: なし

入力はn*nの2次元行列です。
その行列を右側90度回転させる問題です。
アフィン変換等をするのではなく、
ただ単に内容の数値を回転させればいいのです。
例えば入力が
[1,2,3;
4,5,6;
7,8,9]
の場合、
右に回転させ、出力が
[7,4,1;
8,5,2;
9,6,3]
となります。
つまり元々の列が行となり、行が列となるわけですね。

注意すべき事: 

  • 余分なメモリは使わない事

以下回答です。

class Solution {
    public void rotate(int[][] matrix) {
        for (int i=0; i<matrix.length; i++) {
            for (int j=i; j<matrix.length; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
        for (int i=0; i<matrix.length; i++) {
            for (int j=0; j<matrix.length/2; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[i][matrix.length-1-j];
                matrix[i][matrix.length-1-j] = temp;
            }
        }
    }
}

余分なメモリが使えなく、難易度が少し上がりました。
考えとしては、まず対角線を中心に行列を投影します。
例えば入力が
[1,2,3;
4,5,6;
7,8,9]
の場合、
変換後
[1,4,7;
2,5,8;
3,6,9]
となります。
次に真ん中の列を中心にrotateさせます。
すると
[7,4,1;
8,5,2;
9,6,3]
で答えとなります。

今日は以上。
よいプログラミング生活を!