当前位置: 面试刷题>> 矩阵斜线上元素相同 (经典算法题500道)


题目描述补充

题目: 给定一个二维矩阵 matrix,判断并返回矩阵中是否存在至少一条斜线(从左上到右下或右上到左下),使得斜线上的所有元素都相同。斜线可以是矩阵的对角线,也可以是矩阵边缘外的虚拟斜线(即,斜线可以经过矩阵的边界但不一定全部在矩阵内部)。

示例输入

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

示例输出true (因为存在斜线 1-5-9,其上的元素都相同)

示例输入

matrix = [
    [1, 2, 3],
    [2, 2, 1],
    [3, 1, 2]
]

示例输出true (因为存在斜线 1-2-1,其上的元素都相同)

示例输入

matrix = [
    [1, 1, 1],
    [1, 1, 1],
    [1, 1, 2]
]

示例输出false (不存在所有元素都相同的斜线)

PHP 示例代码

function isDiagonalSame($matrix) {
    $rows = count($matrix);
    if ($rows == 0) return false;
    $cols = count($matrix[0]);

    // 检查主对角线(左上到右下)
    for ($i = 0; $i < $rows; $i++) {
        $value = $matrix[$i][$i];
        for ($j = $i + 1, $k = $i - 1; $j < $cols || $k >= 0; $j++, $k--) {
            if ($j < $cols && $matrix[$i][$j] != $value) return false;
            if ($k >= 0 && $matrix[$k][$i] != $value) return false;
        }
    }

    // 检查副对角线(右上到左下)
    for ($i = 0; $i < $rows; $i++) {
        for ($j = 0; $j < $cols; $j++) {
            $value = $matrix[$i][$j];
            $row = $i - ($j - $i);
            $col = $j + ($j - $i);
            // 检查是否越界
            if ($row >= 0 && $col < $cols && $matrix[$row][$col] != $value) return false;
        }
    }

    return true;
}

// 示例用法
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];
echo isDiagonalSame($matrix) ? "true" : "false";

注意: PHP 示例中的副对角线检查可能不是最高效的,因为对于每个元素都进行了边界检查。实际面试中,你可能需要根据情况优化算法。

Python 示例代码

def isDiagonalSame(matrix):
    if not matrix or not matrix[0]:
        return False

    rows, cols = len(matrix), len(matrix[0])

    # 检查主对角线
    for i in range(rows):
        value = matrix[i][i]
        for j in range(i+1, cols):
            if matrix[i][j] != value:
                return False
        for j in range(i-1, -1, -1):
            if matrix[j][i] != value:
                return False

    # 检查副对角线(更高效的检查方式)
    for diff in range(rows + cols - 1):
        value = matrix[max(0, diff - cols + 1)][min(diff, cols - 1)]
        for i in range(max(0, diff - cols + 1), min(diff, rows - 1) + 1):
            j = diff - i
            if matrix[i][j] != value:
                return False

    return True

# 示例用法
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
print(isDiagonalSame(matrix))  # 输出: True

JavaScript 示例代码

function isDiagonalSame(matrix) {
    if (!matrix.length || !matrix[0].length) return false;

    const rows = matrix.length;
    const cols = matrix[0].length;

    // 检查主对角线
    for (let i = 0; i < rows; i++) {
        let value = matrix[i][i];
        for (let j = i + 1; j < cols; j++) {
            if (matrix[i][j] !== value) return false;
        }
        for (let j = i - 1; j >= 0; j--) {
            if (matrix[j][i] !== value) return false;
        }
    }

    // 检查副对角线(简化检查)
    for (let sum = 0; sum < rows + cols - 1; sum++) {
        let value = matrix[Math.max(0, sum - cols + 1)][Math.min(sum, cols - 1)];
        for (let i = Math.max(0, sum - cols + 1), j = Math.min(sum, cols - 1); 
             i <= Math.min(sum, rows - 1); 
             i++, j--) {
            if (matrix[i][j] !== value) return false;
        }
    }

    return true;
}

// 示例用法
const matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];
console.log(isDiagonalSame(matrix)); // 输出: true

码小课网站中有更多相关内容分享给大家学习,包括算法详解、面试技巧、编程实践等,帮助大家更好地掌握编程技能。

推荐面试题