mirror of
https://github.com/TheAlgorithms/C.git
synced 2026-02-10 05:47:03 +00:00
* add Online Stock Span * free obj * Update leetcode/src/901.c Co-authored-by: David Leal <halfpacho@gmail.com> * Rename README.md to DIRECTORY.md * merge conflicts * chore: apply suggestions from code review * chore: apply suggestions from code review * Update leetcode/src/901.c Co-authored-by: Taj <tjgurwara99@users.noreply.github.com> Co-authored-by: David Leal <halfpacho@gmail.com> Co-authored-by: Taj <tjgurwara99@users.noreply.github.com>
69 lines
1.8 KiB
C
69 lines
1.8 KiB
C
// 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);
|
|
*/
|