当前位置: 面试刷题>> 对角线遍历 (经典算法题500道)


题目描述补充

题目:对角线遍历

给定一个包含整数的矩阵 matrix,按对角线顺序返回矩阵中的所有元素(从矩阵的左上角开始,先沿第一条对角线遍历到右上角,然后沿下一条对角线遍历到左下角,以此类推,直到遍历完整个矩阵)。

示例

输入:

matrix = [
  [1,2,3],
  [4,5,6],
  [7,8,9]
]

输出: [1,2,4,7,5,3,6,8,9]

解题思路

对角线的遍历可以通过观察对角线元素的行索引和列索引之和的规律来进行。在矩阵中,同一对角线上的元素,其行索引与列索引之和是相等的。我们可以通过这个规律来遍历矩阵中的元素。

示例代码

PHP

function findDiagonalOrder($matrix) {
    if (empty($matrix)) {
        return [];
    }

    $rows = count($matrix);
    $cols = count($matrix[0]);
    $result = [];
    $up = true; // 控制遍历方向,true为向上,false为向下

    for ($sum = 0; $sum < $rows + $cols - 1; $sum++) {
        if ($sum % 2 == 0) {
            // 偶数行索引和,从左上角到右上角
            for ($i = max(0, $sum - $cols + 1); $i <= min($sum, $rows - 1); $i++) {
                $result[] = $matrix[$i][$sum - $i];
            }
        } else {
            // 奇数行索引和,从右上角到左下角
            for ($i = min($sum, $rows - 1); $i >= max(0, $sum - $cols + 1); $i--) {
                $result[] = $matrix[$i][$sum - $i];
            }
        }
    }

    return $result;
}

Python

def findDiagonalOrder(matrix):
    if not matrix:
        return []

    rows, cols = len(matrix), len(matrix[0])
    result = []
    up = True  # True for up, False for down

    for sum_idx in range(rows + cols - 1):
        if sum_idx % 2 == 0:
            # Traverse from top-left to top-right
            for i in range(max(0, sum_idx - cols + 1), min(sum_idx, rows)):
                result.append(matrix[i][sum_idx - i])
        else:
            # Traverse from top-right to bottom-left
            for i in range(min(sum_idx, rows - 1), max(0, sum_idx - cols + 1) - 1, -1):
                result.append(matrix[i][sum_idx - i])

    return result

JavaScript

function findDiagonalOrder(matrix) {
    if (!matrix.length) return [];

    const rows = matrix.length;
    const cols = matrix[0].length;
    const result = [];
    let up = true; // true for upwards, false for downwards

    for (let sum = 0; sum < rows + cols - 1; sum++) {
        if (sum % 2 === 0) {
            // Traverse from top-left to top-right
            for (let i = Math.max(0, sum - cols + 1); i <= Math.min(sum, rows - 1); i++) {
                result.push(matrix[i][sum - i]);
            }
        } else {
            // Traverse from top-right to bottom-left
            for (let i = Math.min(sum, rows - 1); i >= Math.max(0, sum - cols + 1); i--) {
                result.push(matrix[i][sum - i]);
            }
        }
    }

    return result;
}

码小课网站中有更多相关内容分享给大家学习,包括但不限于算法详解、面试技巧、数据结构等,欢迎访问码小课网站进行深入学习。

推荐面试题