随笔:设计一个栈结构,使得取出栈中最大值时间复杂度为O(1)
2013-06-16 20:07
246 查看
题意:设计一个数据结构,符合栈的特点,即“后进先出”,且加多一个要求,使得取出该栈所有元素最大值的时间复杂度可以控制为O(1)。
说个很明显的错误,使用一个辅助变量,保存当前最大值,每次入栈的值都与该最大值比较,大则替换为最大值。
这样取出最大值则返回该辅助变量,很显然这个只能实现一次正确返回。
总体实现很简单,就是开辟多一个存储最大值索引的栈,该栈和存储数据的栈保持同步,即栈顶指针同时作用这两个栈。
代码也很简单,所以就不解释。
java代码如下:
public class MaxNumFromStack {
public static void main(String[] args) {
MyStack stack=new MyStack();
stack.push(2);
stack.push(3);
stack.push(4);
stack.push(5);
stack.push(1);
stack.push(10);
stack.push(8);
for(int i=0;i<6;i++){
System.out.println("TheNum:"+stack.pop());
System.out.println("MaxNum:"+stack.getMax());
System.out.println("=========================");
}
}
}
class MyStack{
private int top;
private int maxIndex;
private int MAX;
private int[] data;
private int[] maxStackIndex;
public MyStack(){
MAX=10;
top=-1;
maxIndex=-1;
data=new int[MAX];
maxStackIndex=new int[MAX];
}
//入栈
public void push(int num){
top++;
if(top>=MAX){
System.out.println("栈已满,不能入栈");
return;
}
data[top]=num;//先添加到栈中
if(num>getMax()){//大于当前最大值
maxStackIndex[top]=top;//当前是最大值
maxIndex=top;
}else{
//保留最大的值
maxStackIndex[top]=maxIndex;
}
}
//出栈
public int pop(){
if(top<0){
System.out.println("栈为空,不能出栈");
return Integer.MIN_VALUE;
}
int num=data[top];
if(top==0){
maxIndex=-1;
}else if(top==maxIndex){//当前栈顶是最大值,调整最大值
maxIndex=maxStackIndex[top-1];
}
top--;
return num;
}
public int getMax(){
if(maxIndex>=0){
return data[maxIndex];
}else{
//返回最小值
return Integer.MIN_VALUE;
}
}
}
输出:
TheNum:8
MaxNum:10
=========================
TheNum:10
MaxNum:5
=========================
TheNum:1
MaxNum:5
=========================
TheNum:5
MaxNum:4
=========================
TheNum:4
MaxNum:3
=========================
TheNum:3
MaxNum:2
=========================
说个很明显的错误,使用一个辅助变量,保存当前最大值,每次入栈的值都与该最大值比较,大则替换为最大值。
这样取出最大值则返回该辅助变量,很显然这个只能实现一次正确返回。
总体实现很简单,就是开辟多一个存储最大值索引的栈,该栈和存储数据的栈保持同步,即栈顶指针同时作用这两个栈。
代码也很简单,所以就不解释。
java代码如下:
public class MaxNumFromStack {
public static void main(String[] args) {
MyStack stack=new MyStack();
stack.push(2);
stack.push(3);
stack.push(4);
stack.push(5);
stack.push(1);
stack.push(10);
stack.push(8);
for(int i=0;i<6;i++){
System.out.println("TheNum:"+stack.pop());
System.out.println("MaxNum:"+stack.getMax());
System.out.println("=========================");
}
}
}
class MyStack{
private int top;
private int maxIndex;
private int MAX;
private int[] data;
private int[] maxStackIndex;
public MyStack(){
MAX=10;
top=-1;
maxIndex=-1;
data=new int[MAX];
maxStackIndex=new int[MAX];
}
//入栈
public void push(int num){
top++;
if(top>=MAX){
System.out.println("栈已满,不能入栈");
return;
}
data[top]=num;//先添加到栈中
if(num>getMax()){//大于当前最大值
maxStackIndex[top]=top;//当前是最大值
maxIndex=top;
}else{
//保留最大的值
maxStackIndex[top]=maxIndex;
}
}
//出栈
public int pop(){
if(top<0){
System.out.println("栈为空,不能出栈");
return Integer.MIN_VALUE;
}
int num=data[top];
if(top==0){
maxIndex=-1;
}else if(top==maxIndex){//当前栈顶是最大值,调整最大值
maxIndex=maxStackIndex[top-1];
}
top--;
return num;
}
public int getMax(){
if(maxIndex>=0){
return data[maxIndex];
}else{
//返回最小值
return Integer.MIN_VALUE;
}
}
}
输出:
TheNum:8
MaxNum:10
=========================
TheNum:10
MaxNum:5
=========================
TheNum:1
MaxNum:5
=========================
TheNum:5
MaxNum:4
=========================
TheNum:4
MaxNum:3
=========================
TheNum:3
MaxNum:2
=========================
相关文章推荐
- 随笔:实现一个队列,使得取出最大值的时间复杂度较低
- 设计一个栈,出栈时弹出栈中最小的元素,时间复杂度为1
- 设计一个栈,提供一个函数能够找出栈内最大的元素,时间复杂度为O(1)
- 设计队列容器的数据结构,使得返回最大元素的操作时间复杂度尽可能的低。
- 数据结构---设计一个栈,push, pop, min 时间复杂度都是 O(1)
- 输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字 时间复杂度O(NlogN)
- 试设计一个算法,将数组A(0..n-1)中的元素循环右移k位,并要求空间复杂度为O(1),时间复杂度为O(n)。
- 题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,
- 输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字 时间复杂度O(NlogN) 空间复杂度O(1)
- 设计一个栈结构,满足一下条件:min,push,pop操作的时间复杂度为O(1)。
- 数据结构---设计一个栈,push, pop, min 时间复杂度都是 O(1)
- 微软100题40题-设计一个栈结构,满足一下条件:min,push,pop操作的时间复杂度为O(1)。
- 求一个二维整数数组最大子数组之和,时间复杂度为N^2
- Chapter 3 | Stacks and Queues--实现一个函数返回栈中的最小值,时间复杂度为O(1)
- 输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。 时间复杂度O(N) 空间复杂度O(N)
- 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所 有偶数位于数组的后半部分。要求时间复杂度为O(n)。
- 算法设计:将一个数组分为奇数、偶数左右两个部分,要求时间复杂度为O(n)
- 求一个整型数组的最大和的子数列,要求时间复杂度为线性的
- 14.输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)
- 百度笔试:给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。 要求:空间复杂度O(1),时间复杂度为O(n)