打印矩阵 螺旋打印、旋转矩阵

140 阅读1分钟

题目

给定一个矩阵,要求按照螺旋顺序打印矩阵

  • 选取矩阵左上角顶点和右下角顶点,按照顺序打印一圈后,顶点位置往前缩进一个单位,相当于减少一圈,继续打印该圈,然后继续缩紧,直到顶点某一方向相遇,比起寻常遍历更容易写边界条件

image.png

image.png

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--);
  }
}