BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #84797同步于 2014/12/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[问题]leetcode的Min Stack的疑问

kizy008
2014/12/19镜像同步7 回复
第一次做OJ,智商被压制了。原题目是这样的: 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. 刚好最近刚看primer中的vector,就用vector试了一下,代码如下: #include<vector> #include<iostream> #include<cstdlib> using std::vector; class MinStack { private: vector<int> stack,minstack; public: void push(int x) { if(stack.empty() || x<minstack.back()) { minstack.push_back(x); } stack.push_back(x); } void pop() { if(stack.empty()) return; if(stack.back()==minstack.back()) minstack.pop_back(); stack.pop_back(); } int top() { return stack.back(); } int getMin() { return minstack.back(); } }; void main() { MinStack s; for(int i=0;i<10;i++) { s.push((i-5)*(i-5)); std::cout << "min_val = " << s.getMin() << "\ttop_val = " << s.top() << std::endl; } system("pause"); } 结果无情的被告知内存超过限制[ema1] 看人家的代码使用双端队列做的: #include <iostream> #include <deque> using namespace std; //因为需要在constant time当中获得最小值,将最小值单独存储 class MinStack { public: void push(int x) { stack.push_front(x); if (minStack.empty() || minStack.front() >= x) { minStack.push_front(x); } } void pop() { if(stack.empty()) { return; } if(stack.front() == minStack.front()) { minStack.pop_front(); } stack.pop_front(); } int top() { if(stack.empty()) { return 0; } return stack.front(); } int getMin() { if(minStack.empty()) { return 0; } return minStack.front(); } private: deque<int> stack; deque<int> minStack; }; int main() { MinStack stack; stack.push(512); stack.push(1024); stack.push(1024); stack.push(512); stack.pop(); stack.getMin(); stack.pop(); stack.getMin(); stack.pop(); stack.getMin(); } Ctrl+C +V后就通过了。瞬间就崩塌了[ema36]。 那么问题来了,为什么vector不行deque就可以呢? 他们在内存开销上有什么区别吗? 新手,请轻拍[ema23]
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
kizy008机器人#1 · 2014/12/19
自己先抢一楼
libenchao机器人#2 · 2014/12/20
我用的stack,也可以。
libenchao机器人#3 · 2014/12/20
个人猜测是这样的,vector容器一般只会自增,不会自减,可能会造成容器中有很多没有用到的空间,而且每次申请都是申请当前空间的2倍。deque是动态管理存储,用的是堆空间,把一段一段的空间虚拟的当做连续的线性空间,试着猜测一下,当数据量减少的时候,deque应该也会适当的释放内存。 然后我看了一下stack的声明:template <class T, class Container = deque<T> > class stack;默认也是用的deque容器。 坐等大神解释。
kizy008机器人#4 · 2014/12/20
【 在 libenchao 的大作中提到: 】 : 个人猜测是这样的,vector容器一般只会自增,不会自减,可能会造成容器中有很多没有用到的空间,而且每次申请都是申请当前空间的2倍。deque是动态管理存储,用的是堆空间,把一段一段的空间虚拟的当做连续的线性空间,试着猜测一下,当数据量减少的时候,deque应该也会适当的释放内存。 : 然后我看了一下stack的声明:template <class T, class Container = deque<T> > class stack;默认也是用的deque容器。 : 坐等大神解释。 看来还有好多东西要学啊,受教了。真心点个赞![ema4]
buptxrc机器人#5 · 2014/12/25
且不说内存的事,你的push里面少了个 = [ema1][ema1]
libenchao机器人#6 · 2014/12/25
学长高见[em68] 【 在 buptxrc 的大作中提到: 】 : 且不说内存的事,你的push里面少了个 = :
kizy008机器人#7 · 2014/12/25
额,代码好像没粘全 【 在 buptxrc (若晨团 && 江南西道 && cstdlib.com) 的大作中提到: 】 : 且不说内存的事,你的push里面少了个 = : [ema1][ema1] 通过『我邮2.0』发布