代码
思路大致就是用一个变量存储变换后的数组
var rotate = function(matrix) {
let h = matrix.length
let w = matrix[0].length
let line = []
let a = []
for (let i = 0; i < w; i++) {
for (let j = h-1; j >= 0; j--) {
line.push(matrix[j][i])
}
a.push(line)
line=[]
}
return a
};
这样在力扣通过不了,不知道为啥。力扣好像直接就用的是matrix,也不需要返回。
但是matrix=a是不行的,很迷
var rotate = function(matrix) {
let h = matrix.length
let line = []
let a = []
for (let i = 0; i < h; i++) {
for (let j = h-1; j >= 0; j--) {
line.push(matrix[j][i])
}
a.push(line)
line=[]
}
//这里
for (let i = 0; i < h; i++) {
for (let j = 0; j < h; j++) {
matrix[i][j] = a[i][j];
}
}
};
这样就可以了
原地转换
大致是四项一个循环,可以使用一个临时变量来替换
然后大致分为两种情况:
代码:
var rotate = function(matrix) {
const n = matrix.length;
for (let i = 0; i < Math.floor(n / 2); ++i) {
for (let j = 0; j < Math.floor((n + 1) / 2); ++j) {
const temp = matrix[i][j];
matrix[i][j] = matrix[n - j - 1][i];
matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
matrix[j][n - i - 1] = temp;
}
}
};
用翻转代替旋转
简单说来就是变换两次,就不用了变换四次了,本质上说来也是一种原地旋转
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]];
}
}
};