剑指Offer_包含min函数的栈

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

参考思路
       由于时间复杂度需要为O(1),因此我们需要在每次入栈时候就判断最小值,并一直保留下来,这可以用一个临时变量来实现。但是如果就一个简单的临时变量会在最小值出栈时出现问题,因为最小值出栈了就无法再找到前面的所有最小值。因此可以采用双栈来实现,用一个整型栈保留堆栈元素,另一个整型栈保存所有的最小值,并更新。

参考代码

import java.util.Stack;
import java.util.ArrayList;

public class Solution {
  ArrayList<Integer> arrayList = new ArrayList<Integer>();
	 ArrayList<Integer> arrayListOther = new ArrayList<Integer>();
	 int minNode = Integer.MAX_VALUE;
	 public void push(int node) {
		 if(minNode > node) {
			 minNode = node;
			 arrayListOther.add(node);
		 }
	        arrayList.add(node);
	    }
	    
	    public void pop() {
	    	int topNode = arrayList.get(arrayList.size()-1);
	    	if(topNode == minNode) {
	    		arrayListOther.remove(arrayListOther.size()-1);
	    		minNode = arrayListOther.get(arrayListOther.size()-1);
	    	}
	        arrayList.remove(arrayList.size()-1);
	    }
	    
	    public int top() {
	        return arrayList.get(arrayList.size()-1);
	    }
	    
	    public int min() {
	        return minNode;
	    }
}

奇妙的思路-----压缩还原法
       每次入栈时,如果入栈元素比当前最小值小,则更新最小值。同时用入栈元素去减当前的最小值,然后只将差值入栈。
       出栈时,如果栈顶元素为负数,说明这个就是当前的最小值,更新最小值,然后出栈;如果栈顶元素为正数,则直接出栈。
参考代码如下:

import java.util.Stack;
import java.util.ArrayList;

public class Solution {
   ArrayList<Integer> arrayList = new ArrayList<Integer>();
	 int minNode = Integer.MAX_VALUE;
	 	public void push(int node) {
	 		arrayList.add(node-minNode);
	 		if(node < minNode) {
	 			minNode = node;
	 		}
	    }
	    
	    public void pop() {
	    	int topNode = arrayList.get(arrayList.size()-1);
	    	if(topNode < 0) {
	    		minNode = minNode - topNode;
	    	}
	    	arrayList.remove(arrayList.size()-1);
	    }
	    
	  public int top() {
	        return (arrayList.get(arrayList.size()-1) + minNode);
	    }
	    
	    public int min() {
	        return minNode;
	    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值