数组 - 螺旋矩阵
重点:坚持循环不变量原则
59.螺旋矩阵II
本题要求求出矩阵
class Solution {
public int[][] generateMatrix(int n) {
//初始化一个矩阵
int[][] mat = new int[n][n];
int val = 1;
int tar = n*n;
int l = 0 , r = n-1;
int t = 0 , b = n-1;
//注意遵循循环不变量原则
while(val<=tar){
//左→右
for(int i=l;i<=r;i++){
mat[t][i] = val++;
}
t++;
//上→下
for(int i=t;i<=b;i++){
mat[i][r] = val++;
}
r--;
//右→左
for(int i=r;i>=l;i--){
mat[b][i] = val++;
}
b--;
//下→上
for(int i=b;i>=t;i--){
mat[i][l] = val++;
}
l++;
}
return mat;
}
}
与上题的区别在于,本题是已知矩阵,按顺时针的顺序返回矩阵元素;而上题则是把元素按顺序放入矩阵中,返回矩阵
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
Integer[] res = new Integer[m*n];
int l = 0,r = n-1;
int t = 0,b = m-1;
int x = 0;
while(true){
//左→右
for(int i = l;i<=r;i++ ){
res[x++] = matrix[t][i];
}
if(++t>b)break;
//上→下
for(int i = t;i<=b;i++){
res[x++] = matrix[i][r];
}
if(--r<l)break;
//右→左
for(int i = r;i>=l;i--){
res[x++] = matrix[b][i];
}
if(--b<t)break;
//下→上
for(int i = b;i>=t;i--){
res[x++] = matrix[i][l];
}
if(++l>r)break;
}
return Arrays.asList(res);
}
}