技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

leetCode : Rotate Image

leetCode の Rotate Image を解いてみた。
https://leetcode.com/problems/rotate-image/

この問題は、int型の2次元配列を右に回転させるというもの。

例えば、以下のような感じ。

インプット
  [1,2,3]
  [4,5,6]
  [7,8,9]

アウトプット
  [7,4,1]
  [8,5,2]
  [9,6,3]

問題を解く際の制限としては、「in-place」、すなわち、引数で受け取った配列そのものをいじる、ということ。(余分な配列を生成してはいけない。)
全くロジックが思いつかなかったので、ヒントを見たところ、2次元配列の (i, j) と (j ,i) を入れ替えて、左右対称に入れ替えれば、右回転するとのこと。これは、知っていないと厳しい。。。

気を取り直して、上述のロジックで実装してみた。

    public void rotate(int[][] matrix) {
        int len = matrix[0].length;

        // 半分だけ(i,j) と (j,i) を入れ替える。
        for (int i = 0; i < len; i++) {
            for (int j = i + 1; j < len; j++) {
                swapForIndex(matrix, i, j);
            }
        }

        // 半分だけ左右対称に入れ替える。
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len / 2; j++) {
                swapSymmetry(matrix, i, j);
            }
        }
    }

    // (i,j) と (j,i) を入れ替える。
    private void swapForIndex(int[][] matrix, int i, int j) {
        int tmp = matrix[i][j];
        matrix[i][j] = matrix[j][i];
        matrix[j][i] = tmp;
    }

    // 左右対称に入れ替える。
    private void swapSymmetry(int[][] matrix, int i, int j) {
        int len = matrix[0].length;
        int tmp = matrix[i][j];
        matrix[i][j] = matrix[i][len - 1 - j];
        matrix[i][len - 1 - j] = tmp;
    }

入れ替えを全体に対して行うと、もとの2次元配列に戻ってしまうので、半分だけに実施するところがポイント。

実行結果は以下。

Runtime: 0 ms, faster than 100.00% of Java online submissions for Rotate Image.
Memory Usage: 39.7 MB, less than 5.77% of Java online submissions for Rotate Image.

十分速いようなので、これで良しとする。