Design an algorithm that collects daily price quotes for some stock and returns the span of that stock's price for the current day.
The span of the stock's price today is defined as the maximum number of consecutive days (starting from today and going backward) for which the stock price was less than or equal to today's price.
- For example, if the price of a stock over the next
7days were[100,80,60,70,60,75,85], then the stock spans would be[1,1,1,2,1,4,6].
Implement the StockSpanner class:
StockSpanner()Initializes the object of the class.int next(int price)Returns the span of the stock's price given that today's price isprice.
Example 1
Input
["StockSpanner", "next", "next", "next", "next", "next", "next", "next"]
[[], [100], [80], [60], [70], [60], [75], [85]]
Output
[null, 1, 1, 1, 2, 1, 4, 6]
Explanation
StockSpanner stockSpanner = new StockSpanner();
stockSpanner.next(100); // return 1
stockSpanner.next(80); // return 1
stockSpanner.next(60); // return 1
stockSpanner.next(70); // return 2
stockSpanner.next(60); // return 1
stockSpanner.next(75); // return 4, because the last 4 prices (including today's price of 75) were less than or equal to today's price.
stockSpanner.next(85); // return 6
Constraints
- 1 <= price <= 1e5
- At most 1e4 calls will be made to next.
Solution
自己写的双向链表(暴力枚举),过是过了但是时间空间都很大。
typedef struct node *PtrToNode;
struct node {
int data;
PtrToNode *pre, *next;
};
typedef struct {
PtrToNode front, rear;
} StockSpanner;
StockSpanner* stockSpannerCreate() {
StockSpanner *obj = (StockSpanner*)malloc(sizeof(StockSpanner));
obj->front = (PtrToNode)malloc(sizeof(struct node));
obj->rear = obj->front;
obj->front->data = -1;
obj->front->pre = NULL;
obj->front->next = NULL;
return obj;
}
int stockSpannerNext(StockSpanner* obj, int price) {
PtrToNode ptr = (PtrToNode)malloc(sizeof(struct node));
ptr->data = price;
ptr->pre = obj->rear;
ptr->next = NULL;
obj->rear = ptr;
int cnt = 0;
while (ptr->data != -1) {
if (ptr->data <= price) cnt++;
else break;
ptr = ptr->pre;
}
return cnt;
}
void stockSpannerFree(StockSpanner* obj) {
PtrToNode p, q;
p = obj->front;
q = p->next;
while(q) {
free(p);
p = q;
q = p->next;
}
free(p);
free(obj);
}
/**
* Your StockSpanner struct will be instantiated and called as such:
* StockSpanner* obj = stockSpannerCreate();
* int param_1 = stockSpannerNext(obj, price);
* stockSpannerFree(obj);
*/
题解方法:单调栈
typedef struct Node {
int first;
int second;
struct Node *next;
} Node;
typedef struct {
Node *stack;
int idx;
} StockSpanner;
Node* nodeCreate(int first, int second) {
Node *obj = (Node *)malloc(sizeof(Node));
obj->first = first;
obj->second = second;
obj->next = NULL;
return obj;
}
StockSpanner* stockSpannerCreate() {
StockSpanner *obj = (StockSpanner *)malloc(sizeof(StockSpanner));
obj->idx = -1;
obj->stack = nodeCreate(-1, INT_MAX);
return obj;
}
int stockSpannerNext(StockSpanner* obj, int price) {
obj->idx++;
while (price >= obj->stack->second) {
Node *p = obj->stack;
obj->stack = obj->stack->next;
free(p);
}
int ret = obj->idx - obj->stack->first;
Node *p = nodeCreate(obj->idx, price);
p->next = obj->stack;
obj->stack = p;
return ret;
}
void stockSpannerFree(StockSpanner* obj) {
for (Node *p = obj->stack; p;) {
Node *node = p;
p = p->next;
free(node);
}
free(obj);
}