剑指offer20:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

1 题目描述

  定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

2. 思路和方法

  利用辅助栈来存储现有栈的最小值。在入栈和出栈的时候将现有栈和最小值栈进行比较。入栈时,若新值比最小值栈的栈顶还小,则将该值同时push到最小值栈;出栈时,若现有栈的栈顶和最小值栈栈顶一致,则同时出栈,否则,仅仅现有栈pop;通过这一操作,最小值栈的栈顶将永远是现有栈元素中的最下值。

3 C++核心代码

 1 class Solution {
 2 public:
 3     stack<int> my_stack, min_stack;
 4     void push(int value) {
 5         my_stack.push(value);
 6         if (min_stack.size() == 0)
 7             min_stack.push(value);
 8         if (value < min_stack.top())
 9             min_stack.push(value);
10     }
11     void pop() {
12         if (my_stack.top() == min_stack.top())
13         {
14             my_stack.pop();
15             min_stack.pop();
16         }
17         else
18             my_stack.pop();
19     }
20     int top() {
21         return my_stack.top();
22     }
23     int min() {
24         return min_stack.top();
25     }
26 };

4 C++完整代码

参考资料

https://blog.csdn.net/u011261670/article/details/81008032

https://blog.csdn.net/zy20150613/article/details/89928236

原文地址:https://www.cnblogs.com/wxwhnu/p/11410213.html

时间: 2024-10-03 00:31:57

剑指offer20:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。的相关文章

实现栈最小元素的min函数

1 #include<iostream> 2 #include<stack> 3 using namespace std; 4 class min_stack 5 { 6 public: 7 void push(int); 8 void pop(); 9 int min(); 10 int size() 11 { 12 return data.size(); 13 } 14 private: 15 stack<int> data; 16 stack<int>

剑指offer20

package jianzhiOffer; import java.util.Stack; /**  * 定义栈的数据结构,请在该类型中实现一个能够得  * 到栈最小元素的min函数.   * @author user  * 思路:创建两个栈,一个用于存储数据,一个用于  * 存储最小数据,还要注意两个栈应该保持同步的入栈  * 和出栈,以保证minStack顶部始终是最小的数据  */ public class ch20 { Stack<Integer> stack = new Stack&

17、把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. eg: 输入 3 4 5 1 2 输出 1 思路:用二分法查找最小元素 三种情况: (1)rotateArray[mid] >rotateArray[high]: like:[x,x,x,6,x,x,2],此时最小数字一

剑指Offer20 栈的压入弹出序列是否正确

1 /************************************************************************* 2 > File Name: 20_IsPopOrder.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月30日 星期二 19时53分19秒 6 **************************************

剑指offer-第五章优化时间和空间效率(从1到n的整数中1出现的次数)

题目:输入一个整数n,从1到n这n个十进制整数中1出现的次数. 思路1:对1到n中的任意一个数i对其进行求余数来判断个位是否为1,然后再求除数,判断十位是否为1.统计出1的个数.然后对1到n用一个循环将所有的数都加起来.时间复杂度为O(nlogn). 思路2:根据数字的规律来求.例如:21344这个数,我们将它分成两部分,第一部分为1345~21344.这部分我们可以先求出最高位上一出现的次数.又分为两种情况,10000~19999这种情况下最高位大于1,1出现的次数为10^4,另一种是1000

剑指Offer(Java版)第十二题:地上有一个m行n列的方格。一个机器人从坐标(0, 0)的格子开始移动, 它每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。 如,当k为18时,机器人能够进入方格(35, 37),因为3+5+3+7=18。但它不能进入方格(35, 38), 因为3+5+3+8=19。请问该机器人能够到达多少个格子?

/*地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移动, 它每一次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子. 如,当k为18时,机器人能够进入方格(35, 37),因为3+5+3+7=18.但它不能进入方格(35, 38), 因为3+5+3+8=19.请问该机器人能够到达多少个格子?*/public class Class12 { public int moveCount(int rows, int cols, int threshold){

剑指Offer(Java版)第三十五题:给一个数组,返回它的最大连续子序列的和

/*HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1) */ import java.util.*; publ

包含min函数的栈(剑指offer,c++)

题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数. #include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <cmath> #include <cstdlib> #include <algorithm> #include <stack> using namespac

【剑指offer】30、包含min函数的栈

题目 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 思路 能够想到存储最小元素,关键是当最小元素被弹出之后,如何存储次小元素. 我们用一个辅助栈来存储. 1.当压入数字时,如果它比最小的还要小,则在辅助栈和数据栈中都压入该元素:如果它比最小元素大,则在数据栈中压入该数字,在辅助栈就依旧压入最小元素. 2.当弹出数字时,数据栈和辅助栈都弹出 3.当获得min时,直接获得栈顶元素即可 class Solution { public: stac