hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧!
function rotate(matrix) {
// 获取矩阵的边长,因为是 n × n 的矩阵,所以行数和列数都为 n
const n = matrix.length;
// 第一步:沿主对角线(从左上角到右下角)翻转矩阵
// 主对角线元素位置特点是行索引和列索引相等
// 我们只需要交换主对角线一侧的元素与另一侧对称位置的元素即可
for (let i = 0; i < n; i++) {
// 从主对角线开始,因为主对角线左侧的元素已经在之前的循环中交换过了
for (let j = i; j < n; j++) {
// 交换 matrix[i][j] 和 matrix[j][i] 的值
// 使用数组解构赋值实现元素交换
[matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]];
}
}
// 第二步:将每一行进行左右翻转
for (let i = 0; i < n; i++) {
// 定义左指针,指向当前行的第一个元素
let left = 0;
// 定义右指针,指向当前行的最后一个元素
let right = n - 1;
// 当左指针小于右指针时,继续交换元素
while (left < right) {
// 交换当前行中左指针和右指针所指元素的值
[matrix[i][left], matrix[i][right]] = [matrix[i][right], matrix[i][left]];
// 左指针右移一位
left++;
// 右指针左移一位
right--;
}
}
return matrix;
}
// 测试示例
const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
rotate(matrix);
console.log(matrix);
代码思路分析
- 要将一个 n × n 的二维矩阵顺时针旋转 90 度,我们可以通过以下两个步骤实现:
- 沿主对角线翻转矩阵:主对角线是从矩阵的左上角到右下角的对角线。经过这一步操作后,原本在 (i, j) 位置的元素会移动到 (j, i)
位置。 - 将每一行进行左右翻转:经过第一步操作后,再将每一行的元素从左到右进行反转,就可以得到顺时针旋转 90 度后的矩阵。