-
-
Notifications
You must be signed in to change notification settings - Fork 181
/
self-crossing.py
66 lines (60 loc) · 1.35 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
54
55
56
57
58
59
60
61
62
63
64
65
66
# -*- coding:utf-8 -*-
# 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(object):
def isSelfCrossing(self, x):
"""
:type x: List[int]
:rtype: bool
"""
n = len(x)
x.append(0.5) # let x[-1] = 0.5
if n < 4: return False
grow = x[2] > x[0]
for i in range(3,n):
if not grow and x[i] >= x[i-2]: return True
if grow and x[i] <= x[i-2]:
grow = False
if x[i] + x[i-4] >= x[i-2]:
x[i-1] -= x[i-3]
return False