LeetCode 54 Spiral Matrix
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,Given the following matrix:
[[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]]
You should return [1,2,3,6,9,8,7,4,5].
旋转matrix这种corner case极多的题一直是软肋。。。真的是智商不够用啊。。。看了各路大神的解法,有递归,有数学解,最关键的还是理解终止条件与边界条件的判断。挑了一个最容易实现的版本,还有待继续理解熟练!!!
思路一:
一般走path的题,都可以用dir变量表示上下左右的方向。除此之外,本题的关键是理解终止条件:
行或列均没有格子可以走了!!!
那到底每行与每列可以走多少格子呢?
以row为例:
假设有0~m-1一共m行,已经走了r行,
那么还可以走m-r个格子。
从遍历一开始,有m个格子可以走,到最后只剩0个的时候跳出循环!
思路二:
和之前的一样,但可以略去dir变量,因为本题遍历方向的变化是存在规律的,即行向右,列向下,行向左,列向上,因此用一个循环模拟这四个步骤即可。关键还是判断什么时候终止,且每次走几步。要明白每完成一次行扫描或列扫描,对应的需要扫描的行数与列数都减1!!!
public class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> path = new ArrayList<>();
if (matrix.length == 0) return path;
int rowStart = 0, rowEnd = matrix.length-1, colStart = 0, colEnd = matrix[0].length-1;
// Until it reach the spiral center that is rowStart > rowEnd or colStart > colEnd
while (true) {
// Right
for (int j = colStart; j <= colEnd; j++) {
path.add(matrix[rowStart][j]);
}
rowStart++;
if (rowStart > rowEnd) break;
// Down
for (int i = rowStart; i <= rowEnd; i++) {
path.add(matrix[i][colEnd]);
}
colEnd--;
if (colStart > colEnd) break;
// Left
for (int j = colEnd; j >= colStart; j--) {
path.add(matrix[rowEnd][j]);
}
rowEnd--;
if (rowStart > rowEnd) break;
// Up
for (int i = rowEnd; i >= rowStart; i--) {
path.add(matrix[i][colStart]);
}
colStart++;
if (colStart > colEnd) break;
}
return path;
}
}