剑指offer - 画图让抽象形象化
顺时针打印矩阵
题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下 4 X 4 矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字 1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
解题思路:
怎么找到标记点?对于每一层来说,设左上角的元素坐标为 (i, j),那么右上角的元素坐标为 (i, n - j - 1),右下角的元素坐标是 (m - i - 1 ,n - j - 1),左下角的元素坐标是 (m - i - 1, j)。找到标记点后,就是对行/列进行+/-的过程。
怎么防止重复遍历?找到四个坐标点后,每一层的遍历可以拆分成 4 个部分。
function printMatrix(matrix) {
// write code here
let m = matrix.length;
let n = matrix[0].length; //m和n代表矩阵的行数和列数
if (!m || !n) {
return [];
}
let res = [];
let i = 0;
let j = 0; //(i,j)表示左上角的那个坐标
while (i <= m - 1 - i && j <= n - 1 - j) {
for (let col = j; col <= n - 1 - j; col++) {
res.push(matrix[i][col]); //第一行
}
for (let row = i + 1; row <= m - 1 - i; row++) {
res.push(matrix[row][n - 1 - j]); //最后一列
}
if (i < m - i - 1 && j < n - j - 1) {
for (let col = n - j - 2; col >= j + 1; col--) {
res.push(matrix[m - i - 1][col]);
}
for (let row = m - i - 1; row >= i + 1; row--) {
res.push(matrix[row][j]);
}
}
i++;
j++;
}
return res;
}