题目讲解:LeetCode
重点:
- 按层模拟。四个标记。
思路:
- 按层模拟
1.每一层遍历 顶 右 底 左。每遍历完一个对应的边界需要处理。
复杂度:
- m 和 n 分别是行数和列数
- 时间复杂度:O(mn)。每个元素都要被访问一次。
- 空间复杂度:O(1)。除了输出数组以外,空间复杂度是常数。
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> result = new ArrayList<>();
int curTop = 0;
int curRight = matrix[0].length - 1;
int curBottom = matrix.length - 1;
int curLeft = 0;
// 重点: 按层模拟, 每一层遍历 顶 右 底 左
while (curLeft <= curRight && curTop <= curBottom) {
// 当前层的最顶行
for (int i = curLeft; i <= curRight; i++) {
result.add(matrix[curTop][i]);
}
curTop++;
// 当前层的最右列
for (int i = curTop; i <= curBottom; i++) {
result.add(matrix[i][curRight]);
}
curRight--;
// 当前外层的最底行还存在
if (curTop <= curBottom) {
for (int i = curRight; i >= curLeft; i--) {
result.add(matrix[curBottom][i]);
}
}
curBottom--;
// 当前外层的最左列还存在
if (curLeft <= curRight) {
for (int i = curBottom; i >= curTop; i--) {
result.add(matrix[i][curLeft]);
}
}
curLeft++;
}
return result;
}