挺有趣的一道題,看題解才勉強做出。。。
題意就是給n個長度,然後以上左下右的順序走。比如 [2,1,1,2]就是先上走2 左走1 下走1 右走2 如果還有就繼續向上,向左……
求路徑中是否存在交叉。
如果在紙上畫一畫,就會發現,在保證不出現交叉的前提下,可畫的類型無非幾種
(實不相瞞,我用微信截圖隨便畫的)
就是說如果出現交叉,並不需要考慮和相離較遠的某條線段的交叉,因爲肯定會和附近的某條線進行交叉。所以算法是 O(N) 而不是 O(N^2)
總結一下可能出現的交叉 不畫了 copy from https://blog.csdn.net/zmq570235977/article/details/51705518
圖中考慮的三種情況,實際要考慮多個方向。不過判斷條件是一樣的。
class Solution { public: bool isSelfCrossing(vector<int>& x) { int n = x.size(); // 小於4條邊是不會出現交叉的 for (int i = 3; i < n; i++) { if ( x[i - 1] <= x[i - 3] && x[i] >= x[i - 2] || (i >= 4 && i <= 8 && x[i - 4] + x[i] >= x[i - 2] && x[i - 3] == x[i - 1]) || (i >= 5 && i <= 8 && x[i - 1] <= x[i - 3] && x[i - 5] + x[i - 1] >= x[i - 3] && x[i - 4] <= x[i - 2] && x[i - 4] + x[i] >= x[i - 2]) ) return true; } return false; } };