要求:
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
思路:
要生成一个 n×n 的螺旋矩阵,可以模拟顺时针填充的过程。定义四个边界:左边界 left、右边界 right、上边界 top、下边界 bottom。然后按照从左到右、从上到下、从右到左、从下到上的顺序依次填充数字,每填完一条边就收缩对应的边界,直到所有数字填满。
算法步骤
- 从左到右填充上边(行 top,列从 left 到 right),然后 top++。
- 从上到下填充右边(列 right,行从 top 到 bottom),然后 right–。
- 从右到左填充下边(行 bottom,列从 right 到 left),然后 bottom–。
- 从下到上填充左边(列 left,行从 bottom 到 top),然后 left++。
题解:
public int[][] generateMatrix(int n) {
int[][] nums = new int[n][n];
int num = 1;
int top = 0;
int left = 0;
int right = n – 1;
int bottom = n – 1;
while (num <= n * n) {
// 从左到右填充上边
for (int i = left; i <= right; i++) {
nums[top][i] = num++;
}
top++; // 上边界下移
// 从上到下填充右边
for (int i = top; i <= bottom; i++) {
nums[i][right] = num++;
}
right—; // 右边界左移
// 从右到左填充下边
for (int i = right; i >= left; i—) {
nums[bottom][i] = num++;
}
bottom—; // 下边界上移(修正点1)
// 从下到上填充左边
for (int i = bottom; i >= top; i—) {
nums[i][left] = num++; // 修正点2:正确索引为 nums[i][left] }
left++; // 左边界右移
}
return nums;
}
注意!
本题一定要注意对边界条件的处理,本例的4个指针都为有效索引(左闭右闭),因此整个过程的for循环中两个边界都要赋值
网硕互联帮助中心






评论前必须登录!
注册