-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathstockSpanProblem.py
79 lines (58 loc) · 1.7 KB
/
stockSpanProblem.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
67
68
69
70
71
72
73
74
75
76
77
78
79
# simple
def stockSpanProblem(arr):
length = len(arr)
ans = [None] * length
ans[0] = 1
for i in range(1, length):
ans[i] = 1
j = i - 1
while j >= 0 and arr[i] >= arr[j]:
ans[i] += 1
j -= 1
print(ans)
class Stack:
"""
class for creating stack DS
function it have :
push -> push value to stack
pop -> return a value out of stack
isEmpty -> return true if stack is empty
top -> return value from stack without removing it
"""
def __init__(self):
self.stack = []
def push(self, index, element):
self.stack.append([index, element])
def isEmpty(self):
return True if len(self.stack) == 0 else False
def pop(self):
return -1 if self.isEmpty() else self.stack.pop()
def top(self):
return self.stack[-1] if not self.isEmpty() else -1
def stockSpanProblemStack(arr):
length = len(arr)
s = Stack()
ans = []
for i in range(0, length):
if s.isEmpty():
ans.append(-1)
else:
if s.top()[1] > arr[i]:
ans.append(s.top()[0])
else:
while not s.isEmpty() and s.top()[1] <= arr[i]:
s.pop()
if s.isEmpty():
ans.append(-1)
else:
ans.append(s.top()[0])
s.push(i, arr[i])
for i in range(length):
ans[i] = i - ans[i]
return ans
def main():
arr = [10, 4, 5, 90, 120, 80]
stockSpanProblem(arr)
print(stockSpanProblemStack(arr))
if __name__ == "__main__":
main()