public final class SpiralMatrix {
/**
* @Description
* @Author fucheng
* @Date 2021-9-9 15:45
* @Param []
* @return int[][]
*/
private int[][] construct(int h, int w) {
int[][] arr = new int[h][w];
int height = arr.length;
int weight = 0;
int temp = 1;
System.err.println("arr.length=" + height);
for (int i = 0; i < height; ++i) {
if (weight == 0) weight = arr[i].length;
for (int j = 0; j < weight; ++j) {
arr[i][j] = temp;
++temp;
}
}
return arr;
}
/**
* @Description
* @Author fucheng
* @Date 2021-9-9 15:45
* @Param [matrix]
* @return java.util.List<java.lang.Integer>
*/
public ArrayList<Integer> spiralOrder1(int[][] matrix) {
int height = matrix.length;
if (height == 0) return new ArrayList<>(0);
int weight = matrix[0].length;
int size = weight * height;
ArrayList<Integer> list = new ArrayList<>(size);
int max_h_index = height - 1;
int max_w_index = weight - 1;
int index1 = 0, index2 = 0, index3 = 0, index4 = 0;
while (list.size() < size) {
// 从左往右
for (int j = index1; j <= max_w_index - index2; ++j) {
list.add(matrix[index1][j]);
}
++index1;
if (list.size() == size) return list;
//右侧 从上到下
for (int j = index1; j <= max_h_index - index2; ++j) {
list.add(matrix[j][max_w_index - index2]);
}
++index2;
if (list.size() == size) return list;
//下侧从右到左
for (int j = max_w_index - index2; j >= index3; --j) {
list.add(matrix[max_h_index - index3][j]);
}
++index3;
if (list.size() == size) return list;
//右侧从下到上
for (int j = max_h_index - index3; j > index4; --j) {
list.add(matrix[j][index4]);
}
++index4;
if (list.size() == size) return list;
}
return list;
}
/**
* @Description
* @Author fucheng
* @Date 2021-9-10 15:35
* @Param [matrix]
* @return java.util.ArrayList<java.lang.Integer>
*/
public ArrayList<Integer> spiralOrder(int[][] matrix) {
int height = matrix.length;
if (height == 0) return new ArrayList<>(0);
int weight = matrix[0].length;
int size = weight * height;
ArrayList<Integer> list = new ArrayList<>(size);
int top = 0, bottom = height - 1, left = 0, right = weight - 1;
while (top <= bottom && left <= right) {
// 顶部:左 -> 右, 列变,行不变
for (int i = left; i <= right; i++) {
list.add(matrix[top][i]);
}
++top;
// 右侧:上 -> 下, 行变,列不变
for (int i = top; i <= bottom; i++) {
list.add(matrix[i][right]);
}
--right;
// 底部:右 -> 左, 列变,行不变
for (int i = right; i >= left && top <= bottom; i--) {
list.add(matrix[bottom][i]);
}
--bottom;
// 左侧: 下 -> 上, 行变,列不变
for (int i = bottom; i >= top && left <= right; i--) {
list.add(matrix[i][left]);
}
++left;
}
return list;
}
public static void main(String[] args) {
SpiralMatrix matrix = new SpiralMatrix();
// System.err.println(matrix.spiralOrder(matrix.construct(3, 4)));
// System.err.println(matrix.spiralOrder(matrix.construct(4, 3)));
//System.err.println(matrix.spiralOrder(matrix.construct(5, 6)));
System.err.println(matrix.spiralOrder(matrix.construct(3, 1)));
}
}