题目
给定一个矩阵,要求按照螺旋顺序打印矩阵
- 选取矩阵左上角顶点和右下角顶点,按照顺序打印一圈后,顶点位置往前缩进一个单位,相当于减少一圈,继续打印该圈,然后继续缩紧,直到顶点某一方向相遇,比起寻常遍历更容易写边界条件
function alg(arr) {
let tR = 0,
tC = 0;
let dR = arr.length - 1;
let dC = arr[0].length - 1;
while (tR <= dR && tC <= dC) {
// 每次改变对角位置坐标
process(arr, tR++, tc++, dR--, dC--);
}
}
// (a,b)表示左上角顶点,(c,d)表示右下角顶点
function process(arr, a, b, c, d) {
if (b === d) { // 矩阵只有一行的情况
for (let i = a; i <= c; i++) {
console.log(arr[i][b]);
}
} else if (a === c) {// 矩阵只有一列的情况
for (let i = b; i <= d; i++) {
console.log(arr[a][i]);
}
} else {
let curC = b;
let curR = a;
while (curC !== d) {
console.log(arr[a][curC]);
curC++;
}
while (curR !== c) {
console.log(arr[curR][d]);
curR++;
}
while (curC !== b) {
console.log(arr[c][curC]);
curC--;
}
while (curR !== a) {
console.log(arr[curR][b]);
curR--;
}
}
}
题目
旋转矩阵,用有限的变量,空间复杂度O(1),实现将一个矩阵旋转90度
- 选取左上角顶点和右下角顶点,从外层开始,四条边挨个置换,外层置换完成后,顶角各自向内缩减1个单位继续置换
// (a,b)左上角坐标,(c,d)右下角坐标
function process(arr, a, b, c, d) {
const times = d - b;
let temp = 0;
for (let i = 0; i < times; i++) {
temp = m[a][b + i];
m[a][b + i] = m[c - i][b]; // 上边->左边
m[c - i][b] = m[c][d - i]; // 右边->上边
m[c][d - i] = m[a + i][d]; // 下边->右边
m[a + i][d] = temp; // 左边->下边
}
}
function print(arr) {
let a = 0,
b = 0,
c = arr.length - 1,
d = arr[0].length - 1;
while (a < b) {
print(arr, a++, b++, c--, d--);
}
}