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