[LeetCode] Self Crossing 自交

 

You are given an array x of n positive numbers. You start at point (0,0) and moves x[0] metres to the north, then x[1] metres to the west, x[2] metres to the south, x[3] metres to the east and so on. In other words, after each move your direction changes counter-clockwise.html

Write a one-pass algorithm with O(1) extra space to determine, if your path crosses itself, or not.java

Example 1:
數組

Given x = ,
┌───┐
│   │
└───┼──>
    │

Return true (self crossing)
[2, 1, 1, 2]

Example 2:
post

Given x = ,
┌──────┐
│      │
│
│
└────────────>

Return false (not self crossing)
[1, 2, 3, 4]

Example 3:
url

Given x = ,
┌───┐
│   │
└───┼>
 
Return true (self crossing)
[1, 1, 1, 1]

這道題給了咱們一個一位數組,每一個數字是個移動量,按照上左下右的順序來前進每個位移量,問咱們會不會和以前的軌跡相交,並且限定了常量的空間複雜度,我立馬想到了貪吃蛇遊戲,可是這條蛇不會自動向前移動哈。言歸正傳,這題我不會,參考的網上大神們的解法,實際上相交的狀況只有如下三種狀況:spa

     x(1)
    ┌───┐
x(2)│   │x(0)
    └───┼──>
    x(3)│
        

第一類是第四條邊和第一條邊相交的狀況,須要知足的條件是第一條邊大於等於第三條邊,第四條邊大於等於第二條邊。一樣適用於第五條邊和第二條邊相交,第六條邊和第三條邊相交等等,依次向後類推的狀況...code

 

      x(1)
    ┌──────┐
    │      │x(0)
x(2)│      ^
    │      │x(4)
    └──────│
      x(3)

第二類是第五條邊和第一條邊重合相交的狀況,須要知足的條件是第二條邊和第四條邊相等,第五條邊大於等於第三條邊和第一條邊的差值,一樣適用於第六條邊和第二條邊重合相交的狀況等等依次向後類推...htm

 

      x(1)
    ┌──────┐
    │      │x(0)
x(2)│     <│────│
    │       x(5)│x(4)
    └───────────│
        x(3)

第三類是第六條邊和第一條邊相交的狀況,須要知足的條件是第四條邊大於等於第二條邊,第三條邊大於等於第五條邊,第五條邊大於等於第三條邊和第一條邊的差值,第六條邊大於等於第四條邊和第二條邊的差值,一樣適用於第七條邊和第二條邊相交的狀況等等依次向後類推...blog

那麼根據上面的分析,咱們不難寫出代碼以下:遊戲

class Solution {
public:
    bool isSelfCrossing(vector<int>& x) {
        for (int i = 3; i < x.size(); ++i) {
            if (x[i] >= x[i - 2] && x[i - 3] >= x[i - 1]) {
                return true;
            }
            if (i >= 4 && x[i-1] == x[i-3] && x[i] >= x[i-2] - x[i-4]) {
                return true;
            }
            if (i >= 5 && x[i-2] >= x[i-4] && x[i-3] >= x[i-1] && x[i-1] >= x[i-3] - x[i-5] && x[i] >= x[i-2] - x[i-4]) {
                return true;
            }
        }
        return false;
    }
};

 

參考資料:

https://leetcode.com/discuss/88054/java-oms-with-explanation

https://leetcode.com/discuss/88196/re-post-2-o-n-c-0ms-solutions

 

LeetCode All in One 題目講解彙總(持續更新中...)

相關文章
相關標籤/搜索