当前位置: 面试刷题>> 矩阵斜线上元素相同 (经典算法题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 示例代码 ```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 示例代码 ```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 示例代码 ```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 ``` **码小课**网站中有更多相关内容分享给大家学习,包括算法详解、面试技巧、编程实践等,帮助大家更好地掌握编程技能。
推荐面试题