对角线遍历矩阵,求解《498. 对角线遍历》

力扣《498. 对角线遍历》示例 1 图示

例题

498. 对角线遍历

给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
示例 1: 输入:mat = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,4,7,5,3,6,8,9]

答案

对角线遍历

var findDiagonalOrder = function(mat) {
  const m = mat.length - 1, n = mat[0].length - 1, r = new Int32Array((m + 1) * (n + 1))
  for (let i = 0, pos = 0; i <= m + n + 1; i++) {
    if (i % 2 === 0) {
      let x = i < m ? i : m, y = i < m ? 0 : i - m
      while (x >= 0 && y <= n) {
        r[pos++] = mat[x][y]
        x--
        y++
      }
    } else {
      let x = i < n ? 0 : i - n, y = i < n ? i : n
      while (x <= m && y >= 0) {
        r[pos++] = mat[x][y]
        x++
        y--
      }
    }
  }
  return r
};
function findDiagonalOrder(mat: number[][]): number[] {
  const m = mat.length - 1, n = mat[0].length - 1, r = new Array((m + 1) * (n + 1))
  for (let i = 0, pos = 0; i <= m + n + 1; i++) {
    if (i % 2 === 0) {
      let x = i < m ? i : m, y = i < m ? 0 : i - m
      while (x >= 0 && y <= n) {
        r[pos++] = mat[x][y]
        x--
        y++
      }
    } else {
      let x = i < n ? 0 : i - n, y = i < n ? i : n
      while (y >= 0 && x <= m) {
        r[pos++] = mat[x][y]
        x++
        y--
      }
    }
  }
  return r
};
class Solution {
  public int[] findDiagonalOrder(int[][] mat) {
    int m = mat.length - 1, n = mat[0].length - 1;
    int[] r = new int[(m + 1) * (n + 1)];
    for (int i = 0, pos = 0; i <= m + n + 1; i++) {
      if (i % 2 == 0) {
        int x = i < m ? i : m, y = i < m ? 0 : i - m;
        while (x >= 0 && y <= n) {
          r[pos++] = mat[x][y];
          x--;
          y++;
        }
      } else {
        int x = i < n ? 0 : i - n, y = i < n ? i : n;
        while (y >= 0 && x <= m) {
          r[pos++] = mat[x][y];
          x++;
          y--;
        }
      }
    }
    return r;
  }
}
class Solution:
  def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:
    m, n, pos = len(mat) - 1, len(mat[0]) - 1, 0
    r = [0] * ((m + 1) * (n + 1))
    for i in range(0, m + n + 2):
      if i % 2 == 0:
        x, y = i if i < m else m, 0 if i < m else i - m
        while x >= 0 and y <= n:
          r[pos] = mat[x][y]
          pos += 1
          x -= 1
          y += 1
      else:
        x, y = 0 if i < n else i - n, i if i < n else n
        while y >= 0 and x <= m:
          r[pos] = mat[x][y]
          pos += 1
          x += 1
          y -= 1
    return r
func findDiagonalOrder(mat [][]int) []int {
  m, n := len(mat) - 1, len(mat[0]) - 1
  r := make([]int, (m + 1) * (n + 1))
  for i, pos := 0, 0; i <= m + n + 1; i++ {
    var x, y int
    if i % 2 == 0 {
      if i < m {
        x = i
        y = 0
      } else {
        x = m
        y = i - m
      }
      for x >= 0 && y <= n {
        r[pos] = mat[x][y]
        pos++
        x--
        y++
      }
    } else {
      if i < n {
        x = 0
        y = i
      } else {
        x = i - n
        y = n
      }
      for y >= 0 && x <= m {
        r[pos] = mat[x][y]
        pos++
        x++
        y--
      }
    }
  }
  return r
}
class Solution {
  function findDiagonalOrder($mat) {
    $m = count($mat) - 1;
    $n = count($mat[0]) - 1;
    $r = array_fill(0, ($m + 1) * ($n + 1), 0);
    for ($i = $pos = 0; $i <= $m + $n + 1; $i++) {
      if ($i % 2 === 0) {
        $x = $i < $m ? $i : $m;
        $y = $i < $m ? 0 : $i - $m;
        while ($x >= 0 && $y <= $n) {
          $r[$pos++] = $mat[$x][$y];
          $x--;
          $y++;
        }
      } else {
        $x = $i < $n ? 0 : $i - $n;
        $y = $i < $n ? $i : $n;
        while ($y >= 0 && $x <= $m) {
          $r[$pos++] = $mat[$x][$y];
          $x++;
          $y--;
        }
      }
    }
    return $r;
  }
}

垂直扫描:求解《944. 删列造序》
Python 行转列,垂直扫描,求解《944. 删列造序》
二维前缀和:求解《303. 区域和检索 - 数组不可变》《304. 二维区域和检索 - 矩阵不可变》《427. 建立四叉树》
前缀和,二维前缀和,求数组的区间和、矩阵指定区域面积,并建立四叉树。求解《303. 区域和检索 - 数组不可变》《304. 二维区域和检索 - 矩阵不可变》《427. 建立四叉树》
利用矩阵在三维空间的投影性质:求解《883. 三维形体投影面积》
利用矩阵在三维空间的投影性质,求解《883. 三维形体投影面积》