您的位置:首页 > 其它

leetcode 59. Spiral Matrix II

2017-08-11 15:22 495 查看
Given an integer n, generate a square matrix filled with elements from 1 to n2 in
spiral(螺旋形的) order.
For example,

Given n = 
3
,
You should return the following matrix:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]


很经典的一道题了。

我的思路是按照4个方向来走:→ ↓ ← ↑ ,每次触到尽头 ( 矩阵边界 或者 已填充的格子) 都换一个方向。

public int[][] generateMatrix(int n) {
int[] direction_x=new int[]{0,1,0,-1};//方向是顺时针
int[] direction_y=new int[]{1,0,-1,0};//即 向右,向下,向左,向上
int[][] matrix=new int

;
int x=0,y=0;
int pointer=0;
for(int i=1;i<=n*n;i++){
matrix[x][y]=i;

int nextX=x+direction_x[pointer];
int nextY=y+direction_y[pointer];
if( nextX<0 || nextX>=n || nextY<0 || nextY>=n ||
matrix[nextX][nextY]!=0
){
pointer=(pointer+1)%4;
nextX=x+direction_x[pointer];
nextY=y+direction_y[pointer];
}
x=nextX;
y=nextY;
}
return matrix;
}
大神则使用的是缩小边界法。如:当n-1行已被填充,则把下边界设为n-2。

public class Solution {
public int[][] generateMatrix(int n) {
// Declaration
int[][] matrix = new int

;

// Edge Case
if (n == 0) {
return matrix;
}

// Normal Case
int rowStart = 0;
int rowEnd = n-1;
int colStart = 0;
int colEnd = n-1;
int num = 1; //change

while (rowStart <= rowEnd && colStart <= colEnd) {
for (int i = colStart; i <= colEnd; i ++) {
matrix[rowStart][i] = num ++; //change
}
rowStart ++;

for (int i = rowStart; i <= rowEnd; i ++) {
matrix[i][colEnd] = num ++; //change
}
colEnd --;

for (int i = colEnd; i >= colStart; i --) {
if (rowStart <= rowEnd)
matrix[rowEnd][i] = num ++; //change
}
rowEnd --;

for (int i = rowEnd; i >= rowStart; i --) {
if (colStart <= colEnd)
matrix[i][colStart] = num ++; //change
}
colStart ++;
}

return matrix;
}
}


这个解法也适用于矩阵是 m*n 的情形。
此为隐藏吐槽内容:(在某乎上用这个出题,来考验别人是不是程序员,也太low了吧。别的不说,人家是不是程序员管你屁事,还要你考验?这道题做出来了,也别太高兴,任重而道远,人品也很重要。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: