Blog.

螺旋矩阵 II

Cover Image for 螺旋矩阵 II
Bernie
Bernie

59. 螺旋矩阵 II

leetcode 链接

思路:

1.选择左闭右开[level, n - level - 1)的区间方式,然后循环遍历,每次遍历都是从左到右,从上到下,从右到左,从下到上,使得每个边的循环次数都保持一致。 2.然后循环次数为 n / 2,如果 n 为奇数,则最后一个元素需要单独处理。

typescript 解法

function generateMatrix(n: number): number[][] {
  const ret = new Array(n).fill(0).map(() => new Array(n).fill(0));

  const totalLevel: number = Math.floor(n / 2);
  let level = 0;
  let count = 1;
  while (level != totalLevel) {
    let length: number = n - level - 1;
    for (let i = level; i < length; i++) {
      ret[level][i] = count;
      count++;
    }
    for (let j = level; j < length; j++) {
      ret[j][length] = count;
      count++;
    }
    for (let k = length; k > level; k--) {
      ret[length][k] = count;
      count++;
    }
    for (let l = length; l > level; l--) {
      ret[l][level] = count;
      count++;
    }
    level++;
  }
  if (n % 2 == 1) {
    ret[totalLevel][totalLevel] = count;
  }
  return ret;
}

go 解法

func generateMatrix(n int) [][]int {
    // init result
    ret := make([][]int, n)
    for i := 0; i < n; i ++ {
        temp := make([]int, n)
        ret[i] = temp
    }
    level := 0
    index := 1
    for level != n / 2 {
        currentLength := n - 1 - level
        for j := level; j < currentLength; j ++ {
            ret[level][j] = index
            index ++
        }
        for k := level; k < currentLength; k ++ {
            ret[k][currentLength] = index
            index ++
        }
        for l := currentLength; l > level; l -- {
            ret[currentLength][l] = index
            index ++
        }
        for o := currentLength; o > level; o -- {
            ret[o][level] = index
            index ++
        }
        level ++
    }
    if n % 2 == 1 {
        ret[n/2][n/2] = index
    }
    return ret
}