这两道题一正一反,一个是往出读,一个是往里写。
1.
class Solution {
public int[][] generateMatrix(int n) {
int[][] res=new int[n][n];
int r1=0,r2=n-1;
int c1=0,c2=n-1;
int s=1;
while(r1<=r2&&c1<=c2)
{
for(int i=c1;i<=c2;i++){res[r1][i]=s++;}
for(int i=r1+1;i<=r2;i++){res[i][c2]=s++;}
for(int i=c2-1;i>=c1;i--){res[r2][i]=s++;}
for(int i=r2-1;i>r1;i--){res[i][c1]=s++;}
//矩阵一定是方阵所以不需要额外的判断
r1++;
r2--;
c1++;
c2--;
}
return res;
}
}
结果:
2、
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res= new ArrayList<>();
if(matrix.length==0)
{
return res;
}
int r1=0,r2=matrix.length-1;
int c1=0,c2=matrix[0].length-1;
while(r1<=r2&&c1<=c2)
{
for(int i=c1;i<=c2;i++) res.add(matrix[r1][i]);
for(int i=r1+1;i<=r2;i++) res.add(matrix[i][c2]);
if(r1<r2&&c1<c2)//注意这里,因为矩阵不一定是方阵,所以防止重复访问。
{
for(int i=c2-1;i>=c1;i--) res.add(matrix[r2][i]);
for(int i=r2-1;i>r1;i--) res.add(matrix[i][c1]);
}
r1++;
r2--;
c1++;
c2--;
}
return res;
}
}