Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
旋转图像
给定一个 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].length1 <= n <= 20-1000 <= matrix[i][j] <= 1000
思路分析
方法一
分析示例中旋转的规律,可以看到:
- 第一行的第 n 个元素旋转后正好是最后一列的第 n 个元素。
- 第二行的第 n 个元素旋转后正好是倒数第二列的第 n 个元素。
- 同理,第三行以及第四行的第 n 个元素旋转后正好是倒数第三列以及第四列的第 n 个元素。
- 那么我们可以找到如下规律:
第i行的第j个元素旋转后正好是倒数第i列的第j个元素。即:matrix[j][len - i - 1] = matrix[i][j]; - 使用一个辅助数组
temp来做中转; - 定义一个
len行len列元素都为0的二维数组; - 遍历原数组
matrix,按照上述找的规律可知temp[j][len - i - 1] = matrix[i][j]; - 通过第七步可以得到旋转后的新数组
temp,遍历temp,将matrix中的元素进行替换即可。
方法二
- 如上图所示,我们可以看到 matrix 经过水平翻转再经过对角线翻转后可以得到我们想要的结果。
- 因此通过两次遍历数组,可以达到在不使用辅助数组的情况下,得到想要的翻转后的结果。
AC 代码
方法一
/**
* @param {number[][]} matrix
* @return {void} Do not return anything, modify matrix in-place instead.
*/
var rotate = function(matrix) {
const len = matrix.length;
const temp = new Array(len).fill(0).map(() => new Array(len).fill(0));
for (let i = 0; i < len; i++) {
for (let j = 0; j < len; j++) {
temp[j][len - i - 1] = matrix[i][j];
}
}
for (let i = 0; i < len; i++) {
for (let j = 0; j < len; j++) {
matrix[i][j] = temp[i][j];
}
}
};
结果:
- 执行结果: 通过
- 执行用时:60 ms, 在所有 JavaScript 提交中击败了83.11%的用户
- 内存消耗:40.9 MB, 在所有 JavaScript 提交中击败了57.52%的用户
- 通过测试用例:21 / 21
方法二
/**
* @param {number[][]} matrix
* @return {void} Do not return anything, modify matrix in-place instead.
*/
var rotate = function(matrix) {
const n = matrix.length;
for (let i = 0; i < Math.floor(n / 2); i++) {
for (let j = 0; j < n; j++) {
[matrix[i][j], matrix[n - i - 1][j]] = [matrix[n - i - 1][j], matrix[i][j]];
}
}
for (let i = 0; i < n; i++) {
for (let j = 0; j < i; j++) {
[matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]];
}
}
};
结果:
- 执行结果:通过
- 执行用时:60 ms, 在所有 JavaScript 提交中击败了83.11%的用户
- 内存消耗:42.9 MB, 在所有 JavaScript 提交中击败了6.50%的用户
- 通过测试用例:21 / 21