leetCode59. 螺旋矩阵 II
题目描述
/**
*
* 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,
* 且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
*
*/
思路分析
- 螺旋生成矩阵,可以将一个矩阵看作二维数组,也就是按照顺时针在二维数组中填充数据
- 可以分层来填充,即从最外层到最内层依次填充数据,只需要考虑一层的填充结果,然后使用循环依次填充每一层即可
- 定义四个变量 left right top bottom ,表示每一层的四条边,则每次填充就是对这四条边的填充,只需要改变相应的变量即可
- 注意每个角不能重复填充,否则会覆盖,因此需要执行 + 1 或者 - 1的操作
- 源码及详解见下
源码及分析
/**
*
* @param n 要生成的矩阵层数
* @return 返回生成的矩阵
*/
public int[][] generateMatrix(int n) {
//定义二维数组保存生成的结果
int[][] matrix = new int[n][n];
//定义变量 n 为向矩阵填充的数字
int num = 1;
//按照从最外层向最内层填充的方法,定义四个变量依次保存上下左右的位置,默认在最外层
int left = 0 , right = n - 1, top = 0, bottom = n - 1;
//循环填充每一层
while (left <= right && top <= bottom){
//先填充最外层
//上侧
for (int i = left; i <= right ; i++) {
matrix[top][i] = num;
num++;
}
//右侧
for (int i = top + 1; i <= bottom ; i++) {
matrix[i][right] = num;
num++;
}
//下侧
for (int i = right - 1; i >= left ; i--) {
matrix[bottom][i] = num;
num++;
}
//左侧
for (int i = bottom - 1; i > top ; i--) {
matrix[i][left] = num;
num++;
}
//改变变量,及向内移动一层
left++;
right--;
top++;
bottom--;
}
return matrix;
}