Min Stack

14年的开始就给自己定了一个计划就是要动手写自己的博客,不论是技术方面还是生活方面的,但是一直给自己找借口在拖延,直到今天才开始写自己的博客,晚点总比不写好(安慰下自己嘛),之前也有过自己的总结,但总感觉还不够好,也就没有拿出来,偶然看到leetcood(有许多算法的面试题)这个网站,索性就从这里开始了自己的博客。下面是其中一道题的解法和自己遇到的问题



/**
 * Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
	push(x) -- Push element x onto stack.
	pop() -- Removes the element on top of the stack.
	top() -- Get the top element.
	getMin() -- Retrieve the minimum element in the stack.
<span style="white-space:pre">	</span>以上是题目的要求
	解题思路:
	看到这道题我首先想到的是利用JDK提供的stack工具类,然后在MinStack类中利用组合来包含这个类,再定义一个变量min来存放最小值。
	 push数据的时候跟min比较,把较小值赋给min,然后调用stack的push()方法;
	 top()方法的实现就直接利用JDK的stack类的top方法;
	 getMin()直接返回min的值;
	    问题来了,pop()方法怎么实现那?有可能调用pop()方法时把跟min对应的元素给移除了,
	    这时怎么在固定的时间(也就是得到最小值所有时间给栈的容量大小无关)得到min值那?
     	问题的关键是当pop()的是最小值时,怎么得到最小值之前链表的最小值,那么我么就想何不用一个栈minStack存放最小元素之前链表的最小值那,
     	设定一个存放最小值的变量min,当进行push操作时就判断,如果比min小或等于min时就把当前值,也push到minStack中,这时minStack中的值存放了一系列的
     	“当前元素之前链表的最小值”。进行pop操作是,如pop的元素等于minStack栈顶的元素就把minStack栈顶元素移除,这时minStack的栈顶元素就是
		当前元素之前链表的最小值.但经过试验这种方法在leetcode上运行不通过,报了Memory Limit Exceeded(可能是程序运行内存超出了规定)。
		所以就决定了自己动手写个简单的stack实现
	  
 * @author zhanghs
 * @version
 *			1.0,2014-11-26 下午02:50:23
 */
public class MinStack {
	
	 	private long min =0;//当前栈的最小值,注意此处应该用long、
	 	private long [] datas = new long[4];//存放push进来的所有数据,初始化为20
	 	private int index = 0;
	 	private long [] minData = new long [2];//存放“目前为止”最小的元素,初始化为5
	 	private int minIndex = 0;
	 	private int size = 0;				//栈的大小
	 	
	    public void push(int x) {
	    	jugeArraySize(0,datas);
	    	size++;
	    	
	    	if(1==size){
	    		min = x;
	    		minData[0]=x;
	    		datas[0] = x;
	    	}else{
	    		if(min-x>=0){//如果min为int类型,那么当min-x的计算结果超出int的范围时,程序就会报错,所有min要用long
	    			
	    			min = x;
	    			minIndex++;
	    			jugeArraySize(1,minData);
	    			minData[minIndex]=x;
	    		}
	    		datas[++index] = x;
	    	}
	    	
	    }

	    public void pop() {
	    	size--;
	        long temp = datas[index];
	        if(min==temp){
	        	if(minIndex>0){
	        		minIndex--;
	        	}
			 min = 	minData[minIndex];
			}
	        if(index>0){
	        	index--;
	        }
	    }

	    public long top() {
	        return datas[index];
	    }

	    public long getMin() {
	        return min;
	    }
	    /**判断新增一个元素,数组是否会越界,如果会越界则对数组进行扩容
	     * 
	     * @param iFlag
	     * @param array
	     * @author zhanghongseng
	     * @Create Date:  2014-12-1 下午04:26:49
	     */
	    private void jugeArraySize(int iFlag,long [] array){
	    	if(0==iFlag){
	    		if(size>=array.length){
		    		long [] tempArray = new long[2*array.length+1];
		    		System.arraycopy(array, 0, tempArray, 0, array.length);
		    		datas=tempArray;
		    	}
	    	}else {
	    		if(minIndex>=array.length){
		    		long [] tempArray = new long[2*array.length+1];
		    		System.arraycopy(array, 0, tempArray, 0, array.length);
		    		minData=tempArray;
		    	}
	    	}
	    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值