Skip to content

Instantly share code, notes, and snippets.

@shixiaoyu
Created December 10, 2019 04:09
Show Gist options
  • Save shixiaoyu/c609046dc4c11ac1459a65f24bc3705d to your computer and use it in GitHub Desktop.
Save shixiaoyu/c609046dc4c11ac1459a65f24bc3705d to your computer and use it in GitHub Desktop.
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res = new ArrayList<>();
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return res;
}
this.printSpiralOrder(0, 0, matrix.length, matrix[0].length, res, matrix);
return res;
}
// printSpiralOrder is a poor name, function starts with verb, printSpiralOrder, class is noun, function is verb
private void printSpiralOrder(int i, int j, int rowSize, int colSize, List<Integer> res, int[][] matrix) {
if (rowSize <= 0 || colSize <= 0) {
return;
}
if (rowSize == 1 && colSize == 1) {
res.add(matrix[i][j]);
return;
}
if (rowSize == 1) {
for (int k = j; k < j + colSize; k++) {
res.add(matrix[i][k]);
}
return;
}
if (colSize == 1) {
for (int k = i; k < i + rowSize; k++) {
res.add(matrix[k][j]);
}
return;
}
// do the spiral
for (int k = j; k < j + colSize; k++) {
res.add(matrix[i][k]);
}
for (int k = i + 1; k < i + rowSize; k++) {
res.add(matrix[k][j + colSize - 1]);
}
for (int k = j + colSize - 2; k >= i; k--) {
res.add(matrix[i + rowSize - 1][k]);
}
for (int k = i + rowSize - 2; k > i; k--) { // both the start and end need to be i, j, and also care about length
res.add(matrix[k][j]);
}
this.printSpiralOrder(i + 1, j + 1, rowSize - 2, colSize - 2, res, matrix);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment