Given an integer n , generate a square matrix filled with elements from 1 ton 2 in spiral order.
For example, Given n = 3
,
You should return the following matrix:
[
[ 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; } }
原文链接http://blog.csdn.net/crazy__chen/article/details/46402203