常见数据结构面试题目(二)
2015-03-22 15:19
337 查看
题目:
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
此题是Google在06年的面试题。看到时间复杂度后,自然想到用空间换取时间。具体思路如下:
除了题目中要求的栈,额外建立一个用来存储最小值的栈。但v_push>=min时,将v_push压入数值栈,同时将最小值栈顶元素重新压入。当v_push<min时,将v_push压入数值栈和最小值栈。
源代码如下:
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;
源代码如下:
定义栈的数据结构,要求添加一个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); } } }总结,方法二使用一个栈完成方法一的功能,主要是提高了栈的信息量,通过入栈的值的正负来记录最小值的变化,从而提高代码效率。
相关文章推荐
- 常见数据结构面试题目(一)
- 常见数据结构面试题目(四)
- 常见数据结构面试题目(三)
- C++面试常见题目问与答(汇总一)
- 数据结构面试之四——队列的常见操作
- 《妙趣横生的算法》第10章 算法设计与数据结构面试精粹之常见的算法设计题10-2(question?)
- 常见的abap面试题目,请大家对照学习
- 面试10大算法汇总+常见题目解答
- C/C++ 程序员常见面试题目深入剖析
- 常见面试题目3
- 面试10大算法汇总+常见题目解答(Java)
- 前端常见面试题目解答
- 数据结构面试之四——队列的常见操作
- hibernate常见面试题目
- 常见笔试面试题目与解析(1)
- J2SE基础常见面试题目
- Java常见笔试面试题目解析(二):final与static final变量(引用类型)的引用不变
- iOS 常见面试题目-看着不错就转载了 (一)
- 常见的面试题目概念
- spring基础知识汇总及常见面试题目总结