相当难 边界容易搞错 上下左右 指针移动 中止条件值得反复思考
题目 LC59 leetcode.cn/problems/sp…
public int[][] generateMatrix(int n) {
// 初始化结果矩阵
int[][] res = new int[n][n];
// 定义左右边界
int left = 0;
int right = n - 1;
// 定义上下边界
int top = 0;
int bottom = n - 1;
// 初始化当前要填入矩阵的数字
int num = 1;
// 当左边界小于等于右边界且上边界小于等于下边界时,继续填充矩阵
while (left <= right && top <= bottom) {
// 从左到右填充当前上边界这一行
for (int i = left; i <= right; i++) {
res[top][i] = num++;
}
// 上边界下移
top++;
• // 从上到下填充当前右边界这一列
• for (int i = top; i <= bottom; i++) {
• res[i][right] = num++;
• }
• // 右边界左移
• right--;
• // 检查是否仍有下边界行需要填充
• if (top <= bottom) {
• // 从右到左填充当前下边界这一行
• for (int i = right; i >= left; i--) {
• res[bottom][i] = num++;
• }
• // 下边界上移
• bottom--;
• }
• // 检查是否仍有左边界列需要填充
• if (left <= right) {
• // 从下到上填充当前左边界这一列
• for (int i = bottom; i >= top; i--) {
• res[i][left] = num++;
• }
• // 左边界右移
• left++;
• }
}
// 返回生成的螺旋矩阵
return res;
}