LeetCode 335. Self Crossing

挺有趣的一道題,看題解才勉強做出。。。

 

題意就是給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;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章