没事刷刷题能防止老年痴呆, 而且也能让你随时处于最佳状态, 随时都可以炒老板鱿鱼另谋高就.
题目: 设计一个堆栈(Stack)使 push, pop, 和取最小 min 操作时间复杂度都是 O(1).
这题的难点就是在于怎么样用O(1)常数时间复杂度来取得堆栈里的最小值.
class MinStack { public: MinStack() { // write your code here } /* * @param number: An integer * @return: nothing */ void push(int number) { // write your code here } /* * @return: An integer */ int pop() { // write your code here } /* * @return: An integer */ int min() { // write your code here } };
例子:
push(1) pop() // return 1 push(2) push(3) min() // return 2 push(1) min() // return 1
先回顾一下堆栈数据结构. 堆栈是FILO, 也就是先进后出.
在C++里, 我们可以用 STL::vector 来表示堆栈, push 操作对应的就是 push_back 方法, pop 操作对应的是 pop_back 方法, 另外还可以通过 back() 来返回栈最上面的元素(但是并不移除它).
那么, 最方便的办法就是再开一个堆栈用来存储最小值, 每次 push 操作的时候就比较栈最上面的值和即将要插入栈的值哪个小就把它插入到最小栈中. 而 栈弹出的时候也需要对应弹出最小值的栈.
完整的C++方案如下:
class MinStack { private: vector<int> data; vector<int> mins; public: MinStack() { } /* * @param number: An integer * @return: nothing */ void push(int number) { data.push_back(number); if (mins.size() == 0) { mins.push_back(number); } else { int minv = mins.back(); // push updated min value mins.push_back(number < minv ? number : minv); } } /* * @return: An integer */ int pop() { int v = data.back(); data.pop_back(); mins.pop_back(); return v; } /* * @return: An integer */ int min() { return mins.back(); } };
英文: How to Design a Stack with constant time in Push, Pop, Top, and GetMin ?
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK