您的位置:首页 > 理论基础 > 数据结构算法

常见数据结构面试题目(二)

2015-03-22 15:19 337 查看
题目:

定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。

要求函数min、push以及pop的时间复杂度都是O(1)。

此题是Google在06年的面试题。看到时间复杂度后,自然想到用空间换取时间。具体思路如下:

除了题目中要求的栈,额外建立一个用来存储最小值的栈。但v_push>=min时,将v_push压入数值栈,同时将最小值栈顶元素重新压入。当v_push<min时,将v_push压入数值栈和最小值栈。

源代码如下:

package main;

import java.util.Stack;

public class Mystack extends Stack<Integer> {

private Stack<Integer> minValue = new Stack<Integer>();
private Integer min  = null;

@Override
public synchronized Integer pop() {

Integer item = super.pop();
min = minValue.pop();
return item;
}

@Override
public Integer push(Integer item) {

if(min == null || min > item){
min = item;
minValue.push(item);
}else{
minValue.push(min);
}
return super.push(item);
}

public Integer min(){
return min;
}

public static void main(String[] args) {

Mystack stack = new Mystack();
stack.push(5);
System.out.println(stack.min());
stack.push(4);
System.out.println(stack.min());
stack.push(3);
System.out.println(stack.min());
stack.push(6);
System.out.println(stack.min());
stack.push(2);
System.out.println(stack.min());
stack.push(8);
System.out.println(stack.min());
stack.push(1);
System.out.println(stack.min());

}

}
还有一种更简单的方法,算法来源参考http://blog.csdn.net/anchor89/article/details/6055412#comments。该方法只通过一种一个栈就可记录最小值和每一个v_value。具体思路如下:

push操作:

(1)若v_value >= min,将top = v_value - min压入栈中。

(2)若v_value<min,将top=v_value - min压入栈中,此时top为负数,同时min=v_value。

pop操作:

(1)若top>=0,v_value=min+top;

(2)若top<0,此时最小值将发生变化,v_value=min,min=min-top;

源代码如下:

public class Mystack extends Stack<Integer> {
private Integer min = 0;
@Override
public synchronized Integer pop() {

Integer item =  super.pop();
if(item > 0 ){
return item + min;
}else{

Integer top = item;
item = min;
min = min + top;
return item;
}
}
@Override
public Integer push(Integer item) {

Integer top = item - min;
if(top >= 0){
return super.push(top);
}else{
min = item;
return super.push(top);
}
}
}
总结,方法二使用一个栈完成方法一的功能,主要是提高了栈的信息量,通过入栈的值的正负来记录最小值的变化,从而提高代码效率。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: