小哆啦开始刷力扣的第二十九天
54. 螺旋矩阵 - 力扣(LeetCode)
小哆啦接到了一道任务:把一个 n × n 的二维矩阵顺时针旋转 90 度。
“这不简单嘛!”小哆啦自信满满地甩了甩他的圆手,开始思考。
直接上代码!
var rotate = function(matrix) {
let n = matrix.length;
let newMatrix = Array.from({ length: n }, () => new Array(n).fill(0));
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
newMatrix[j][n - 1 - i] = matrix[i][j];
}
}
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
matrix[i][j] = newMatrix[i][j];
}
}
};
小哆啦运行了一下,嘿!真的旋转成功了!可还没等开心多久,小智就默默出现了。
“小哆啦,这样做不对啊。”
“哪里不对了?不是旋转了吗?”
“可是你用的是额外的空间 newMatrix
,这题要求原地旋转,不能新建数组哦!”
小哆啦一愣,脑袋上仿佛有只空气炮炸开:“啊?!原地操作?”
小智开始耐心引导:“你想啊,我们可以一层一层地旋转,每次处理四个角的位置,不需要额外的数组。”
小哆啦听得似懂非懂,但还是决定试一试。
var rotate = function(matrix) {
let n = matrix.length;
for (let i = 0; i < Math.floor(n / 2); i++) {
for (let j = i; j < n - 1 - i; j++) {
let temp = matrix[i][j];
matrix[i][j] = matrix[n - 1 - j][i];
matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
matrix[j][n - 1 - i] = temp;
}
}
};
小哆啦运行了一下,结果还是对的!而且没有额外数组!
“原来是这样!一层一层旋转,每次把四个点调换位置,不需要额外空间!简直像玩魔方一样!”
小智笑了笑:“对,就是魔方思维。”
小哆啦觉得已经很棒了,但小智又抛出了一个新思路:“其实,我们还可以用转置矩阵+左右翻转的方法来简化操作。”
小哆啦惊呆了:“还能这么玩?!”
var rotate = function(matrix) {
let n = matrix.length;
// 先转置矩阵
for (let i = 0; i < n; i++) {
for (let j = i; j < n; j++) {
[matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]];
}
}
// 再左右翻转
for (let i = 0; i < n; i++) {
matrix[i].reverse();
}
};
“转置让行变成列,然后左右翻转就等于顺时针旋转90度!”
小哆啦激动得差点打翻工具箱:“哇!这比魔方还魔法!”
小智拍了拍小哆啦:“别光想着‘做出来’,还要想‘怎么优雅地做’。”
小哆啦点头如捣蒜:“嗯嗯!思维飞跃,从暴力到优雅,这才是解题的乐趣啊!”
下一次解题,小哆啦还能学到什么呢?敬请期待~