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; } }