[leetcode]Min Stack(スタックを取得する最小要素C言語実装)
5480 ワード
Min Stack Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
push(x) – Push element x onto stack. pop() – Removes the element on top of the stack. top() – Get the top element. getMin() – Retrieve the minimum element in the stack.
テーマ:push,pop,topを実現し、スタック要素の最小値を同時に取得できるスタックを設計する.push(x)-スタックpop()-スタックtop()-スタックトップ要素getMin()を取得-スタックの最小要素を取得
问题解决の考え方:スタックを押す、スタックを出る、スタックの中の最小値を探す时间の复雑さはすべてO(1)なので、ネットユーザーのブログの资料によって2つのスタックを申请する必要があります.1つは正常なストレージデータ(data配列)、もう1つは最小値(min配列)を保存するために、そして相応の2つのスタックのスタックのトップポインタを设置して、スタックとスタックを出す时间の复雑さに対して当然O(1)です.しかし難点はgetMinでスタックの最小値を取得することであり、一般的な配列を求める最小値アルゴリズムを用いると、その時間的複雑度はO(n)であるため、min配列に対してdataスタックを格納するためのmin配列の最小値に合致せず、pushデータがdata配列に入ると同時にmin配列のスタックトップ要素と比較し、minより大きいスタックトップ要素はmin配列内に押し込まず、そうでないと同時にmin配列に押し込まれ、これによりgetMin()はmin配列中のスタックトップから直接読み出され,時間複雑度はO(1)である.難点:2つのスタックでデータを格納することは容易ではありません.1つは通常のスタックデータであり、もう1つは前のスタックの最小値を格納するために使用されます.実装Cコード:
push(x) – Push element x onto stack. pop() – Removes the element on top of the stack. top() – Get the top element. getMin() – Retrieve the minimum element in the stack.
テーマ:push,pop,topを実現し、スタック要素の最小値を同時に取得できるスタックを設計する.push(x)-スタックpop()-スタックtop()-スタックトップ要素getMin()を取得-スタックの最小要素を取得
问题解决の考え方:スタックを押す、スタックを出る、スタックの中の最小値を探す时间の复雑さはすべてO(1)なので、ネットユーザーのブログの资料によって2つのスタックを申请する必要があります.1つは正常なストレージデータ(data配列)、もう1つは最小値(min配列)を保存するために、そして相応の2つのスタックのスタックのトップポインタを设置して、スタックとスタックを出す时间の复雑さに対して当然O(1)です.しかし難点はgetMinでスタックの最小値を取得することであり、一般的な配列を求める最小値アルゴリズムを用いると、その時間的複雑度はO(n)であるため、min配列に対してdataスタックを格納するためのmin配列の最小値に合致せず、pushデータがdata配列に入ると同時にmin配列のスタックトップ要素と比較し、minより大きいスタックトップ要素はmin配列内に押し込まず、そうでないと同時にmin配列に押し込まれ、これによりgetMin()はmin配列中のスタックトップから直接読み出され,時間複雑度はO(1)である.難点:2つのスタックでデータを格納することは容易ではありません.1つは通常のスタックデータであり、もう1つは前のスタックの最小値を格納するために使用されます.実装Cコード:
/**
* : 、 、 O(1),
* , (data ), (min ),
* , O(1), getMin ,
* , O(n),
* min data , push data min ,
* min min , min
* getMin() min , O(1)。
*
*/
typedef struct {
int data[20000];// 20000
int min[20000];// min 20000, data
int top;//data
int mintop;//min
} MinStack;
void minStackCreate(MinStack *stack, int maxSize) {// , 20000 , maxSize
stack->top = -1;
stack->mintop = -1;
memset(stack->data, 0, 20000);
memset(stack->min, 0 ,20000);
}
void minStackPush(MinStack *stack, int element) {// data min
if(stack->top < 19999){
stack->top++;
stack->data[stack->top] = element;
if(stack->mintop == -1 || element <= stack->min[stack->mintop]){
stack->mintop++;
stack->min[stack->mintop] = element;
}
}else{
return;
}
}
void minStackPop(MinStack *stack) {// data , data min , min
int temp, temp1;
if(stack->top == -1){
return;
}
temp = stack->data[stack->top];
stack->top--;
if(temp == stack->min[stack->mintop]){
temp1 = stack->min[stack->mintop];
stack->mintop--;
}
}
int minStackTop(MinStack *stack) {
return stack->data[stack->top];
}
int minStackGetMin(MinStack *stack) {// min , data
return stack->min[stack->mintop];
}
void minStackDestroy(MinStack *stack) {//
}