-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSelf Crossing.py
53 lines (37 loc) · 1.17 KB
/
Self Crossing.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
'''
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.
Write a one-pass algorithm with O(1) extra space to determine, if your path crosses itself, or not.
Example 1:
┌───┐
│ │
└───┼──>
│
Input: [2,1,1,2]
Output: true
Example 2:
┌──────┐
│ │
│
│
└────────────>
Input: [1,2,3,4]
Output: false
Example 3:
┌───┐
│ │
└───┼>
Input: [1,1,1,1]
Output: true
'''
class Solution:
def isSelfCrossing(self, x: List[int]) -> bool:
a = b = c = d = e = None
for f in x:
if c is not None and (d <= f and e <= c):
return True
if b is not None and (e == c and f + b >= d):
return True
if a is not None and (b <= d and 0 <= d - f <= b and 0 <= c - e <= a):
return True
a, b, c, d, e = b, c, d, e, f
return False