LeetCode-54. Spiral Matrix
阿新 • • 發佈:2018-03-04
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