Date:2019-4-6
题目地址:https://leetcode-cn.com/problems/rotate-image/comments/
给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
示例 1:
给定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ],
原地旋转输入矩阵,使其变为:
[ [7,4,1], [8,5,2], [9,6,3] ]
示例 2:
给定 matrix =
[ [ 5, 1, 9,11], [ 2, 4, 8,10], [13, 3, 6, 7], [15,14,12,16] ],
原地旋转输入矩阵,使其变为:
[ [15,13, 2, 5], [14, 3, 4, 1], [12, 6, 8, 9], [16, 7,10,11] ]
解答:
首先假设一个 3 * 3 的数组,然后我先旋转四个角的元素,这个很简单,简单排序算法中两个元素交换的延申而已。然后我尝试交换下一组元素,我交换完成外圈元素时,发现了很有规律的现象: 当我们把数组值的行列下标对应到坐标系中时,可以将各元素,看做一个点,那么整个坐标系中有四个点。
四个点的规律如下:四个点绝对向一个方向移动,且有一个下标保持不变。
- 左上角的点,绝对向右移动,
- 右上角的点,绝对向下移动,
- 右下角的点,绝对向左移动,
- 左下角的点,绝对向上移动,
- 归纳得到有两个固定不变的值,其对应在第一次旋转中,分别是0和matrix.length。
- 剩余两个变化的值也有规律,分别是两个运动轨迹:从0->matrix.length和从matrix.length->0
- 提取运动轨迹间的关系,就能通过循环,完成第一圈旋转
- 开始内圈旋转的时候,变换固定值,约束内圈,返回到开始的思路,继续旋转
解题
const rotate = function(matrix) {
let len = matrix.length
for (let i = 0; i < len / 2; i++) {
let start = i
let end = len - i - 1
for (let j = 0; j < end - start; j++) {
let temp = matrix[start][start + j]
matrix[start][start + j] = matrix[end - j][start]
matrix[end - j][start] = matrix[end][end - j]
matrix[end][end - j] = matrix[start + j][end]
matrix[start + j][end] = temp
}
}
}
使用场景
需要旋转展示参数的TABLE列表处会有相关的应用