码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer - 画图让抽象形象化

时间:2020-04-17 00:26:10      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:描述   i++   lang   fun   过程   怎么   for   解题思路   顺时针   

顺时针打印矩阵

题目描述:

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下 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;
}

剑指offer - 画图让抽象形象化

标签:描述   i++   lang   fun   过程   怎么   for   解题思路   顺时针   

原文地址:https://www.cnblogs.com/muzidaitou/p/12716807.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!