题目详情
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。如下图所示
题目来源:LeetCode59
题目分解/做题思路
模拟法,根据实际操作流程模拟步骤,先由左往右,再由上往下,再由右往左,再由上往下,模拟整个流程,上下左右边界逐渐夹击。
解题方法
解题步骤
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int [][] arr = generateMatrix(n);
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
public static int[][] generateMatrix(int n) {
//n 最后构成的二维数组 是 n行n列的
//使用模拟,由左到右,由上到下,由右到左,由下到上
//定义左右上下边界
int left = 0;
int right = n-1;
int top =0;
int bottom = n-1;
int[][] arr =new int[n][n];
int num = 1; //从1 开始往里面填充
int target = n*n ; //填充到n*n结束
/**
* 整体思路,模拟操作流程
* 先 由左到右,填充完一行,然后上边界下移
* 然后由上到下,填充完一列,然后右边界左移
* 然后由右到左,填完底下一行,然后下边界上移
* 然后由下到上,填完这一列,左边界右移
* 上下左右夹击方式
*/
while ( num <= target){
for (int i = left; i <= right ; i++) {
arr[top][i] = num++; //由左到右
}
top++; //第一行填满了,下移
for (int i = top; i <= bottom; i++) {
arr[i][right] = num++; //由上到下
}
right--; //这一列填完了,往左挪
for (int i = right; i >= left ; i--) {
arr[bottom][i] = num++; //由右到左
}
bottom--; //这一行填完了,往上
for (int i = bottom; i >= top; i--) {
arr[i][left] = num++; //由下往上
}
left++; //逐渐 向中间逼近
}
return arr;
}
注:模拟的时候要注意for循环中i的值及arr[][]的值
相关标签:螺旋数组 模拟