leetcode 335. Self Crossing

给定一个含有 n 个正数的数组 x。从点(0,0)开始,向北移动x[0]米,然后向西移动x[1]米,向南移动x[2]米,向东移动x[3]米,持续进行。换句话说,每次移动后你的方向都会逆时针变化。

以 O(1)的空间复杂度写一个一遍扫描算法,判断你的路径是否交叉。

示例 1:

给定 x = [2, 1, 1, 2],
?????
?   ?
???????>
    ?

返回 true (路径交叉了)

示例 2:

给定 x = [1, 2, 3, 4],
????????
?      ?
?
?
?????????????>

返回 false (路径没有相交)

示例 3:

给定 x = [1, 1, 1, 1],
?????
?   ?
?????>

返回 true (路径相交了)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution(object):
def isSelfCrossing(self, x):
"""
:type x: List[int]
:rtype: bool
"""
n = len(x)
if n < 4:
return False

i = 3
while i < n:
if x[i] >= x[i - 2] and x[i - 1] <= x[i - 3]:
return True
if i >= 4:
if x[i - 1] == x[i - 3] and x[i] + x[i - 4] >= x[i - 2]:
return True
if i >= 5:
if x[i] >= x[i - 2] - x[i - 4] >= 0 and x[i - 3] - x[i - 5] <= x[i - 1] <= x[i - 3]:
#if x[i] + x[i - 4] >= x[i - 2] and x[i - 3] <= x[i - 5] + x[i - 1]:
return True
i += 1
return False