-
-
Notifications
You must be signed in to change notification settings - Fork 4.5k
/
Copy path901.c
68 lines (55 loc) · 1.75 KB
/
901.c
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
// Use monotonic stack.
// Keep the stack of monotonically increasing price and index.
// Runtime: O(n)
// Space: O(n)
typedef struct stack{
int price;
int index;
struct stack* previous;
} Stack;
typedef struct {
int index;
Stack* stackPointer;
Stack* sentry;
} StockSpanner;
StockSpanner* stockSpannerCreate() {
Stack* sentry = (Stack *)malloc(sizeof(Stack));
StockSpanner* result = (StockSpanner *)malloc(sizeof(StockSpanner));
result->index = 0;
result->sentry = sentry;
result->stackPointer = sentry;
return result;
}
int stockSpannerNext(StockSpanner* obj, int price) {
while(obj->stackPointer != obj->sentry && obj->stackPointer->price <= price){
Stack* currStackPointer = obj->stackPointer;
obj->stackPointer = obj->stackPointer->previous;
free(currStackPointer);
}
obj->index += 1;
int result = obj->index;
if (obj->stackPointer != obj->sentry){
result -= obj->stackPointer->index;
}
Stack* newStackItem = (Stack *)malloc(sizeof(Stack));
newStackItem->index = obj->index;
newStackItem->price = price;
newStackItem->previous = obj->stackPointer;
obj->stackPointer = newStackItem;
return result;
}
void stockSpannerFree(StockSpanner* obj) {
while(obj->stackPointer != obj->sentry){
Stack* currStackPointer = obj->stackPointer;
obj->stackPointer = obj->stackPointer->previous;
free(currStackPointer);
}
free(obj->sentry);
free(obj);
}
/**
* Your StockSpanner struct will be instantiated and called as such:
* StockSpanner* obj = stockSpannerCreate();
* int param_1 = stockSpannerNext(obj, price);
* stockSpannerFree(obj);
*/