1. 程式人生 > >LeetCode-54. Spiral Matrix

LeetCode-54. Spiral Matrix

end 試用 pau 其他 push osx body while result

一、問題描述

  給定一個矩陣、要求螺旋型輸出矩陣結果。

  例子:給定矩陣[[1,2,3],[4,5,6],[7,8,9]]。輸出結果為1,2,3,6,9,8,7,4,5。

二、問題解決

  將矩陣分解成多個嵌套的空心矩形來遍歷,將每個空心矩形的遍歷分為四個部分:向右增長,向下增長,向左增長,向上增長。(代碼中令direct等於1,2,3,4來表示這四個方向)

  用distance來表示某一個空心矩形遍歷時,轉向位置距離矩陣最外層邊的距離,註意這個遍歷在向左增長完之後加1,應為畫一個空心矩形時,向上增長的盡頭為向右增長的起始點,而不是矩陣邊框。

  其他變量都很好理解了。

vector<int
> spiralOrder(vector<vector<int>>& matrix) { vector<int> result; if (matrix.size() == 0) return result; int direct = 1; int distance = 0; int posx = 0; int posy = 0; bool directchange = false; int step = 0; result.push_back(matrix[posy][posx]);
while (true) { if (direct == 1) { if (posx + distance < matrix[0].size() - 1) posx++; else { directchange = true; direct++; } } else if (direct == 2) { if (posy + distance < matrix.size() - 1
) posy++; else { directchange = true; direct++; } } else if (direct == 3) { if (posx > distance) posx--; else { directchange = true; direct++; distance++; } } else if (direct == 4) { if (posy > distance) posy--; else { directchange = true; direct = 1; } } if (directchange == false) { result.push_back(matrix[posy][posx]); step++; } else directchange = false; if (step == matrix.size() * matrix[0].size()-1) break; } return result; } //這是測試用例 int main() { vector<vector<int>> v = { {1,2,3},{4,5,6},{7,8,9} }; for (auto i : spiralOrder(v)) cout << i << endl; system("pause"); return 0; }

 

LeetCode-54. Spiral Matrix