螺旋矩阵 II
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
思路:我们可以为此矩阵设置上、下、左、右边界,填完一行或一列,响应的边界就向中心收缩,左边界的初始值为0,右边界的初始值为(横向数组的长度-1),上边界的初始值为0,下边界的初始值为(竖向数组的长度-1)。
class Solution {
public int[][] generateMatrix(int n) {
int l = 0, r = n - 1, t = 0, b = n - 1;
int[][] mat = new int[n][n];
int num = 1, tar = n * n;
while(num <= tar){
//左到右
for(int i=l;i<=r;i++) mat[t][i]=num++;
t++;
//上到下
for(int i=t;i<=b;i++) mat[i][r]=num++;
r--;
//右到左
for(int i=r;i>=l;i--) mat[b][i]=num++;
b--;
//下到上
for(int i=b;i>=t;i--) mat[i][l]=num++;
l++;
}
return mat;
}
}
螺旋矩阵 I
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
输出:[1,2,3,6,9,8,7,4,5]示例 2:
输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
思路:可以仿照上一题的思路,但是需要注意不能照搬,因为m x n的矩阵不同于n x n的矩阵。
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list=new ArrayList<>();
//行数
int m=matrix.length;
if(m==0) return list;
//列数
int n=matrix[0].length;
//边界:上t、下b、左l、右r
int t=0,l=0,r=n-1,b=m-1;
int sum=0;
while(sum <= m*n){
for(int i=l;i<=r;i++) {
list.add(matrix[t][i]);
sum++;
}
t++;
if(sum==m*n) break;
for(int i=t;i<=b;i++) {list.add(matrix[i][r]);sum++;}
if(sum==m*n) break;
r--;
for(int i=r;i>=l;i--) {list.add(matrix[b][i]);sum++;}
if(sum==m*n) break;
b--;
for(int i=b;i>=t;i--) {list.add(matrix[i][l]);sum++;}
if(sum==m*n) break;
l++;
}
return list;
}
}