这种题思路很容易想到,就是编程起来太麻烦,在数组里定位容易写错,现在虽然基本题目都是直接在网站文本框里写,告别IDE,但是还是没法一次性写出来无bug的代码,还是需要调试,有时候还经常while忘了i++,忘记return的小错误,以后要注意。
void visit(int[][] a, int x, int m, int n, LinkedList<Integer> l){
if(m==1&&n==1){
l.add(a[x][x]);
return;
}
if(m<=0||n<=0){
//l.add(a[x][x]);
return;
}
int i=0,j=0;
if(m==1){
while(j<n){
l.add(a[x][x+j]);
j++;
}
}else if(n==1){
while(i<m){
l.add(a[x+i][x]);
i++;
}
}else {
while(j<n){
l.add(a[x][x+j]);
j++;
}
i++;
while(i<m){
l.add(a[x+i][x+n-1]);
i++;
}
i--;
j--;
j--;
while(j>=0){
l.add(a[x+m-1][x+j]);
j--;
}
i--;
while(i>=1){
l.add(a[x+i][x]);
i--;
}
visit(a,x+1,m-2,n-2,l);}
}
public List<Integer> spiralOrder(int[][] matrix) {
LinkedList<Integer> l = new LinkedList<Integer>();
int m=matrix.length;
if(m==0) return l;
int n=matrix[0].length;
visit(matrix,0,m,n,l);
return l;
}
第二题和第一题差不多,第一题是转圈访问第二题时转圈生成,直接用的第一题的代码进行修改即可
void visit(int[][] a, int x, int m, int n, int value){
if(m==1&&n==1){
a[x][x]=value;
return;
}
if(m<=0||n<=0){
//l.add(a[x][x]);
return;
}
int i=0,j=0;
if(m==1){
while(j<n){
a[x][x+j]=value++;
j++;
}
}else if(n==1){
while(i<m){
a[x+i][x]=value++;
i++;
}
}else {
while(j<n){
a[x][x+j]=value++;
j++;
}
i++;
while(i<m){
a[x+i][x+n-1]=value++;
i++;
}
i--;
j--;
j--;
while(j>=0){
a[x+m-1][x+j]=value++;
j--;
}
i--;
while(i>=1){
a[x+i][x]=value++;
i--;
}
visit(a,x+1,m-2,n-2,value);}
}
public int[][] generateMatrix(int n) {
int[][] a = new int[n][n];
int value = 1;
visit(a,0,n,n,value);
return a;
}