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