|
| 1 | +// Time: O(N) Space: O(1) |
| 2 | + |
1 | 3 | package leetcode
|
2 | 4 |
|
3 | 5 | func rotate(matrix [][]int) {
|
4 |
| - length := len(matrix) |
5 |
| - // rotate by diagonal 对角线变换 |
6 |
| - for i := 0; i < length; i++ { |
7 |
| - for j := i + 1; j < length; j++ { |
8 |
| - matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j] |
9 |
| - } |
| 6 | + n := len(matrix) |
| 7 | + if n == 1 { |
| 8 | + return |
10 | 9 | }
|
11 |
| - // rotate by vertical centerline 竖直轴对称翻转 |
12 |
| - for i := 0; i < length; i++ { |
13 |
| - for j := 0; j < length/2; j++ { |
14 |
| - matrix[i][j], matrix[i][length-j-1] = matrix[i][length-j-1], matrix[i][j] |
| 10 | + /* rotate clock-wise = 1. transpose matrix => 2. reverse(matrix[i]) |
| 11 | +
|
| 12 | + 1 2 3 4 1 5 9 13 13 9 5 1 |
| 13 | + 5 6 7 8 => 2 6 10 14 => 14 10 6 2 |
| 14 | + 9 10 11 12 3 7 11 15 15 11 7 3 |
| 15 | + 13 14 15 16 4 8 12 16 16 12 8 4 |
| 16 | +
|
| 17 | + */ |
| 18 | + |
| 19 | + for i := 0; i < n; i++ { |
| 20 | + // transpose, i=rows, j=columns |
| 21 | + // j = i+1, coz diagonal elements didn't change in a square matrix |
| 22 | + for j := i + 1; j < n; j++ { |
| 23 | + swap(matrix, i, j) |
15 | 24 | }
|
| 25 | + // reverse each row of the image |
| 26 | + matrix[i] = reverse(matrix[i]) |
| 27 | + } |
| 28 | +} |
| 29 | + |
| 30 | +// swap changes original slice's i,j position |
| 31 | +func swap(nums [][]int, i, j int) { |
| 32 | + nums[i][j], nums[j][i] = nums[j][i], nums[i][j] |
| 33 | +} |
| 34 | + |
| 35 | +// reverses a row of image, matrix[i] |
| 36 | +func reverse(nums []int) []int { |
| 37 | + var lp, rp = 0, len(nums) - 1 |
| 38 | + |
| 39 | + for lp < rp { |
| 40 | + nums[lp], nums[rp] = nums[rp], nums[lp] |
| 41 | + lp++ |
| 42 | + rp-- |
16 | 43 | }
|
| 44 | + return nums |
17 | 45 | }
|
0 commit comments