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].
旋轉(zhuǎn)matrix這種corner case極多的題一直是軟肋犬缨。踢关。。真的是智商不夠用啊愚战。庶近。冤寿≈械看了各路大神的解法毯辅,有遞歸须妻,有數(shù)學(xué)解仔蝌,最關(guān)鍵的還是理解終止條件與邊界條件的判斷。挑了一個(gè)最容易實(shí)現(xiàn)的版本荒吏,還有待繼續(xù)理解熟練A簿!绰更!
思路一:
一般走path的題豆混,都可以用dir變量表示上下左右的方向。除此之外动知,本題的關(guān)鍵是理解終止條件:
行或列均沒(méi)有格子可以走了C笏拧!盒粮!
那到底每行與每列可以走多少格子呢鸵鸥?
以row為例:
假設(shè)有0~m-1一共m行,已經(jīng)走了r行丹皱,
那么還可以走m-r個(gè)格子妒穴。
從遍歷一開(kāi)始,有m個(gè)格子可以走摊崭,到最后只剩0個(gè)的時(shí)候跳出循環(huán)讼油!
思路二:
和之前的一樣,但可以略去dir變量呢簸,因?yàn)楸绢}遍歷方向的變化是存在規(guī)律的矮台,即行向右,列向下根时,行向左瘦赫,列向上,因此用一個(gè)循環(huán)模擬這四個(gè)步驟即可蛤迎。關(guān)鍵還是判斷什么時(shí)候終止确虱,且每次走幾步。要明白每完成一次行掃描或列掃描替裆,對(duì)應(yīng)的需要掃描的行數(shù)與列數(shù)都減1P1纭>轿省!
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;
}
}