Spiral Matrix I: https://leetcode.com/problems/spiral-matrix/
这道题比较简单,就是从外到内一圈一圈地顺时针遍历,需要注意的是最后可能不剩一个圈,而是单行或者单列,这种情况要分别处理。
时间复杂度O(m*n), 空间复杂度O(1)
代码如下:
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> rst = new LinkedList<Integer>();
if(matrix==null) return rst;
int row = matrix.length;
if(row==0) return rst;
int col = matrix[0].length;
int rs=0, re=row-1, cs = 0, ce = col-1;
while(rs<re && cs<ce){
for(int i=cs; i<=ce; i++){
rst.add(matrix[rs][i]);
}
for(int i=rs+1; i<=re; i++){
rst.add(matrix[i][ce]);
}
for(int i=ce-1; i>=cs; i--){
rst.add(matrix[re][i]);
}
for(int i=re-1; i>rs; i--){
rst.add(matrix[i][cs]);
}
rs++;
re--;
cs++;
ce--;
}
if(cs==ce){
for(int i=rs; i<=re; i++){
rst.add(matrix[i][cs]);
}
}
else if(rs==re){
for(int i=cs; i<=ce; i++){
rst.add(matrix[rs][i]);
}
}
return rst;
}
https://leetcode.com/problems/spiral-matrix-ii/
这道题跟上一道题差不多,唯一区别是,有一个counter不断地填数,另外,因为这边规定了肯定是方阵,所以不会有单行单列,只会有最后一圈剩单个位置的情况,单个位置的情况可以在while循环中处理,因此不需要像上一题一样,重新写两个for循环处理单行单列的情况了。
注意 n=0时,也需要返回一个int[][]指针,但此时这个数组的行列长度都为0,注意JAVA是允许行列长度为0的数组存在的。
public int[][] generateMatrix(int n) {
if(n<0) return null;
int[][] matrix = new int[n][n];
int counter = 1;
int rs=0, re=n-1, cs = 0, ce = n-1;
while(rs<=re && cs<=ce){
for(int i=cs; i<=ce; i++){
matrix[rs][i]=counter;
counter++;
}
for(int i=rs+1; i<=re; i++){
matrix[i][ce] = counter;
counter++;
}
for(int i=ce-1; i>=cs; i--){
matrix[re][i] = counter;
counter++;
}
for(int i=re-1; i>rs; i--){
matrix[i][cs] = counter;
counter++;
}
rs++;
re--;
cs++;
ce--;
}
return matrix;
}