当前位置: 面试刷题>> 螺旋矩阵(经典算法150题)
### 题目描述
**螺旋矩阵(Spiral Matrix)** 是一道经典的算法题,要求按照螺旋的顺序填充矩阵。具体来说,给定一个正整数 `n`,生成一个 `n x n` 的矩阵,并填充数字从 1 到 `n*n`,按照顺时针螺旋的顺序进行。
例如,当 `n = 3` 时,生成的螺旋矩阵如下:
```
1 2 3
8 9 4
7 6 5
```
### 解题思路
1. 初始化一个 `n x n` 的矩阵,并设置四个边界:`left`、`right`、`top`、`bottom`。
2. 按照顺时针方向遍历矩阵:
- 从左到右填充上边界。
- 从上到下填充右边界。
- 从右到左填充下边界。
- 从下到上填充左边界。
3. 每完成一个方向的填充后,更新相应的边界。
4. 重复步骤 2 和 3,直到矩阵被完全填充。
### 示例代码
#### PHP 示例
```php
function generateMatrix($n) {
$matrix = array_fill(0, $n, array_fill(0, $n, 0));
$left = 0, $right = $n - 1, $top = 0, $bottom = $n - 1;
$num = 1;
while ($left <= $right && $top <= $bottom) {
// 填充上边
for ($i = $left; $i <= $right; $i++) {
$matrix[$top][$i] = $num++;
}
$top++;
// 填充右边
for ($i = $top; $i <= $bottom; $i++) {
$matrix[$i][$right] = $num++;
}
$right--;
if ($top <= $bottom) {
// 填充下边
for ($i = $right; $i >= $left; $i--) {
$matrix[$bottom][$i] = $num++;
}
$bottom--;
}
if ($left <= $right) {
// 填充左边
for ($i = $bottom; $i >= $top; $i--) {
$matrix[$i][$left] = $num++;
}
$left++;
}
}
return $matrix;
}
// 示例使用
$n = 3;
$result = generateMatrix($n);
foreach ($result as $row) {
echo implode(' ', $row) . "\n";
}
```
#### Python 示例
```python
def generateMatrix(n):
matrix = [[0] * n for _ in range(n)]
left, right, top, bottom = 0, n - 1, 0, n - 1
num = 1
while left <= right and top <= bottom:
# 填充上边
for i in range(left, right + 1):
matrix[top][i] = num
num += 1
top += 1
# 填充右边
for i in range(top, bottom + 1):
matrix[i][right] = num
num += 1
right -= 1
if top <= bottom:
# 填充下边
for i in range(right, left - 1, -1):
matrix[bottom][i] = num
num += 1
bottom -= 1
if left <= right:
# 填充左边
for i in range(bottom, top - 1, -1):
matrix[i][left] = num
num += 1
left += 1
return matrix
# 示例使用
n = 3
result = generateMatrix(n)
for row in result:
print(' '.join(map(str, row)))
```
#### JavaScript 示例
```javascript
function generateMatrix(n) {
const matrix = Array.from({ length: n }, () => Array(n).fill(0));
let left = 0, right = n - 1, top = 0, bottom = n - 1;
let num = 1;
while (left <= right && top <= bottom) {
// 填充上边
for (let i = left; i <= right; i++) {
matrix[top][i] = num++;
}
top++;
// 填充右边
for (let i = top; i <= bottom; i++) {
matrix[i][right] = num++;
}
right--;
if (top <= bottom) {
// 填充下边
for (let i = right; i >= left; i--) {
matrix[bottom][i] = num++;
}
bottom--;
}
if (left <= right) {
// 填充左边
for (let i = bottom; i >= top; i--) {
matrix[i][left] = num++;
}
left++;
}
}
return matrix;
}
// 示例使用
const n = 3;
const result = generateMatrix(n);
for (let row of result) {
console.log(row.join(' '));
}
```
以上代码均生成了一个 `n x n` 的螺旋矩阵,并按要求打印了结果。