20.旋转图像(学习)
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 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]]
提示:
n == matrix.length == matrix[i].length
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000
解析:
转置矩阵
首先,想象你有一个 n × n 的矩阵,你站在它的左上角。现在,沿着从左上到右下的对角线“看”这个矩阵,你会发现如果沿着这条对角线将矩阵“折叠”或“镜像”,那么矩阵的行会变成列,列会变成行。这就是转置的概念。
在转置过程中,你只需考虑矩阵的上三角(包括对角线)元素,因为当你将某个元素(如 matrix[i][j])与它的对称元素(matrix[j][i])交换时,下三角中的对应元素也会被正确地放置。
反转每一行
完成转置后,你得到了一个“躺着”的矩阵,即原矩阵的列现在变成了行,但顺序是相反的。为了得到顺时针旋转 90 度的效果,你需要将每一行都反转(即首尾交换,然后向中间移动)。
var rotate = function(matrix) {
const n = matrix.length;
// Step 1: Transpose the matrix
for (let i = 0; i < n; i++) {
for (let j = i; j < n; j++) {
// Swap matrix[i][j] with matrix[j][i]
[matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]];
}
}
// Step 2: Reverse each row
for (let i = 0; i < n; i++) {
let left = 0, right = n - 1;
while (left < right) {
// Swap matrix[i][left] with matrix[i][right]
[matrix[i][left], matrix[i][right]] = [matrix[i][right], matrix[i][left]];
left++;
right--;
}
}
};