题目来源:
思路参考carl哥的思路:
我的手撕代码:n为奇数包括了:n为偶数的回环。但是特有的是最后一个元素
顺时针方向,左闭右开
class Solution {
public int[][] generateMatrix(int n) {
if(n == 1) {
return new int[][] {{1}};
}
boolean under = true;
boolean right = false;
boolean down = false;
boolean left = false;
int[][] result = new int[n][n];
int val = 1;
int loopNum = 0;//定义第几个回环,从0开始
while(val <= n*n) {
if (n % 2 == 1 && val == n*n) { //当n为奇数时,最后一个n*n值不能按照回环的方式放,应单独放置。
result[(n / 2)][(n / 2)] = n*n;
break;
}
if(under) {
for(int i = loopNum; i < n - loopNum - 1; i++) {
result[loopNum][i] = val;
System.out.print("loopNum=" + loopNum + ",i="+i);
val++;
}
under = false;
right = true;
//show(result);
}else if(right) {
for(int i = loopNum; i < n - loopNum - 1; i++) {
result[i][n - loopNum - 1] = val;
val++;
}
right = false;
down = true;
//show(result);
}else if(down) {
for (int i = n - loopNum - 1; i > loopNum; i--) {
result[n - loopNum - 1][i] = val;
val++;
}
down = false;
left = true;
//show(result);
}else if(left){
for(int i = n - loopNum - 1; i > loopNum; i--) {
result[i][loopNum] = val;
val++;
}
left = false;
under = true;
loopNum++;
//show(result);
}
}
return result;
}
public static void show(int[][] nums) {
for (int i = 0; i < nums[0].length; i++) {
for (int j : nums[i]) {
System.out.print(j + " ");
}
System.out.println();
}
System.out.println("#######################################");
}
}
执行结果:通过
执行用时:10 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:36.2 MB, 在所有 Java 提交中击败了87.21%的用户
通过测试用例:20 / 20
carl哥实现代码(更简洁,更直接易懂):
class Solution {
public int[][] generateMatrix(int n) {
int[][] result = new int[n][n];
//回环的个数(n为奇数时,最后的n*n构不成一个回环)
int loop = n / 2;
//每个回环的起始位置
int startX = 0, startY = 0;
//定义(a->b的)偏移量
int offset = 1;
//定义当前位置填充的值
int val = 1;
while(loop > 0) {
int x = startX;
int y = startY;
//顺时针方向,左闭右开
//上侧:从左到右
for(; y < startY + n - offset; y++) {
result[startX][y] = val;
val++;
}
//右侧:从上到下
for(; x < startX + n - offset; x++) {
result[x][y] = val;
val++;
}
//下侧:从右向左
for(; y > startY; y--) {
result[x][y] = val;
val++;
}
//左侧:从下到上
for(; x > startX; x--) {
result[x][y] = val;
val++;
}
loop--;
startX++;
startY++;
offset += 2;
}
int mid = n / 2;
if(n % 2 == 1) {
result[mid][mid] = n * n;
}
return result;
}
public static void show(int[][] nums) {
for (int i = 0; i < nums[0].length; i++) {
for (int j : nums[i]) {
System.out.print(j + " ");
}
System.out.println();
}
System.out.println("#######################################");
}
}