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.
十分速いようなので、これで良しとする。