马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
方法一:通例方法 除了存储N个元素外还要存储minValue
- #include <iostream>
- #include <climits> // 包含 INT_MAX
- class Node{
- public:
- Node *next;
- int min,val;
- Node(){
- this->min=INT_MAX;
- }
- Node(int val){
- this->val=val;
- }
- Node(int val,Node *next){
- this->val=val;
- this->next=next;
- }
- };
- class MinStack {
- public:
- Node *root;
- MinStack() {
- this->root=new Node();
- }
-
- void push(int val) {
- Node *node=new Node(val,root->next);
- node->min = root->min;
- root->next=node;
- root->min=min(root->min,val);
- }
-
- void pop() {
- Node *cur = root->next;
- if(cur->val==root->min){
- root->min=cur->min;
- }
- root->next=cur->next;
- delete cur;
- }
-
- int top() {
- return root->next->val;
- }
-
- int getMin() {
- return root->min;
- }
- };
复制代码 方法二 差值存储
只用一个栈 stack 存储每个元素相对于 min_value 的差值,通过判定 差值是否小于 0 来确定当前最小值是否被更换,在 pop() 利用时,如果弹出的差值 diff < 0,阐明 min_value 之前被更新,必要规复前一个最小值
- class MinStack {
- private:
- vector<long long> stack; // 存储与最小值的差值
- long long min_value; // 当前最小值
- public:
- MinStack() {
- min_value=-1;
- }
-
- void push(int val) {
- if(stack.empty()){
- stack.push_back(0);
- min_value=val;
- }else{
- long long diff=val-min_value;
- stack.push_back(diff);
- if(diff<0){
- min_value=val;
- }
- }
- }
- void pop() {
- if(!stack.empty()){
- long long diff = stack.back();
- stack.pop_back();
- if(diff<0){
- min_value=min_value-diff;
- }
- }
- }
- 在 top() 方法中,我们的栈存储的是与 min_value 的差值,所以 stack.back() 可能是:
- -大于等于 0:表示该元素比 min_value 大,存的是 diff = val - min_value
- -小于 0:表示该元素是 min_value 本身,它曾经导致 min_value 变化(说明 val 变成新的最小值)
- int top() {
- return stack.back()<0?min_value:min_value+stack.back();
- }
-
- int getMin() {
- return min_value;
- }
- };
复制代码 |