Given an integer n, generate a square matrix filled with elements from 1 ton2 in spiral order.
For example,
Given n = 3
,
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
题意:给定n,得到n*n的环形数组
分类:数组
解法1:和leetcode--Spiral Matrix一样,只是访问过程变成赋值
public class Solution {
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
int count = 1;
int rows = n;
if(rows==0) return res;
int cols = n;
boolean vis[][] = new boolean[rows][cols];
int x = 0;
while(x*2<cols && x*2<rows){
int endX = rows-x-1;
int endY = cols-x-1;
for(int i=x;i<=endY;i++){
if(!vis[x][i]){
res[x][i]=count++;
vis[x][i] = true;
}
}
for(int i=x+1;i<=endX;i++){
if(!vis[i][endY]){
res[i][endY]=count++;
vis[i][endY] = true;
}
}
for(int i=endY-1;i>=x;i--){
if(!vis[endX][i]){
res[endX][i]=count++;
vis[endX][i] = true;
}
}
for(int i=endX-1;i>x;i--){
if(!vis[i][x]){
res[i][x]=count++;
vis[i][x] = true;
}
}
x = x + 1;
}
return res;
}
}
解法2:优化了遍历过程
public class Solution {
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
if(n==0) return res;
int x = 0,y = 0;
int count = 0,limit = n*n;
int right = n-1,bottom = n-1,left = 0,top = 0;
while(count<limit){
while(count<limit&&y<=right){res[x][y++]=++count;}
y--;x++;top++;
while (count<limit&&x<=bottom) {res[x++][y]=++count;}
x--;y--;right--;
while(count<limit&&y>=left) {res[x][y--]=++count;}
x--;y++;bottom--;
while(count<limit&&x>=top) {res[x--][y]=++count;}
x++;y++;left++;
}
return res;
}
}