剑指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;
}
posted @ 2020-04-16 23:32  木子呆头  阅读(149)  评论(0编辑  收藏  举报