利用差值求栈的最小元素

原创 2015年07月08日 20:35:31

题目来源:https://leetcode.com/problems/min-stack/

题目:用栈扫描一次序列确定其最小值

思路:将差值gap压入栈,第一个要压栈的元素设为最小值,所以将差值0压入栈中,随后待压入栈的元素和min取差值压入栈。下面是每个函数的操作:

push操作:先判断栈是否为空,为空则压如0后将最小值设置为该元素min=cur_elem。如不为空则压如cur_elem-min,如果这是cur_elem<min则设置min=cur_elem。

top操作:*(stack->top-1)取顶元素,如果gap>0,则返回gap+min,如果gap<=0,说明top元素小于等于min,但在push操作中小的值已经赋值过了,所以这时直接return min就可以了。

pop操作:要考虑的是可能会弹出最小值,这时后就要修改最小值了。还是先取*(stack->top-1),也就是gap的值,注意这时不能利用top()来取,如果这时候gap<0,则min=min-gap,因为这时候的min就是用gap表示的数,那么我们要退回上个最小值,所以min=min-gap。

C语言代码

typedef struct {
	long *base;
	long *top;
	int size;
} MinStack;
long min;

void minStackCreate(MinStack *stack, int maxSize) {
	(*stack).base = (long *)malloc(sizeof(long)*maxSize);
	(*stack).top = (*stack).base;
	(*stack).size = maxSize;
}
void minStackPush(MinStack *stack, int element) {
	if ((*stack).top - (*stack).base >= (*stack).size){
		(*stack).base = (long *)realloc((*stack).base, sizeof(long)*((*stack).size + 100));
		(*stack).top = (*stack).base + (*stack).size;
		(*stack).size += 100;
	}

	if (stack->top == stack->base){
		*(stack->top++) = 0L;
		min = element;
	}
	else
		*(stack->top++) = (long)element - min;
	if (element < min)min = element;
}

int minStackTop(MinStack *stack) {
	long gap = *(stack->top - 1);
	if (gap>0)
		return (int)(min + gap);
	else
		return (int)min;
}

void minStackPop(MinStack *stack) {
	long gap = *(stack->top - 1);
	if (gap < 0) min -= gap;
	stack->top--;
}


int minStackGetMin(MinStack *stack) {
	return (int)min;
}

void minStackDestroy(MinStack *stack) {
	free((*stack).base);
	(*stack).base = NULL;
	(*stack).top = NULL;
}
Java代码

class MinStack {
	Stack<Long> stack = new Stack<>();
	long min;
	public void push(int x) {
		if (stack.isEmpty()){
			stack.push(0L);
			min = x;
		}
		else{
			stack.push(x - min);
			if (x<min)
				min = x;

		}
	}
	public void pop() {
		if (stack.isEmpty()) return;
		long tp = stack.pop();
		if (tp<0)
			min -= tp;
	}
	public int top() {
		long top = stack.peek();
		if (top>0)
			return (int)(top + min);
		else
			return (int)min;
	}

	public int getMin() {
		return (int)min;
	}
}


带最小值操作的栈

问题: 实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成。 解法: 该题的解法是...
  • muguangzhilian
  • muguangzhilian
  • 2015年09月06日 09:50
  • 702

找到栈最小元素

题意描述:定义栈的数据结构,请在该类型中实现一个能够找到栈最小元素的min函数。在该栈调用min、push、pop的时间复杂度都是O(1) 解题思路:引用数据栈和辅助栈解题, 入栈:数据栈中直接压...
  • u012050154
  • u012050154
  • 2016年06月06日 15:54
  • 1173

找出栈中最小的元素

package stack; /**  * 找出栈中最小的元素  * 先定义一个辅助栈,栈顶永远存最小的元素。如原栈中添加元素比辅助栈顶元素大,辅助栈的栈顶元素复制一遍  * 放到辅助...
  • hanjiaqun
  • hanjiaqun
  • 2016年09月10日 09:12
  • 731

Min栈——用O(1)时间复杂度返回当前栈中最小元素

题目描述: 定义栈的数据结构,要求添加一个Min函数,能够得到当前栈中的最小元素。 要求函数min,push,pop的时间复杂度都是O(1). 思路:另外用一个最小栈做辅助结...
  • lisongjia123
  • lisongjia123
  • 2015年11月08日 00:02
  • 1102

32.求两个序列的和的最小差值

题目:     有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。 例如:    var a=[1...
  • wangfengfan1
  • wangfengfan1
  • 2015年07月13日 22:00
  • 1095

算法--微软面试题:求一个整数数组元素间最小差值

Q题目 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数....
  • baidu_37107022
  • baidu_37107022
  • 2017年06月01日 16:01
  • 2033

如何用O(1)的时间复杂度求栈中最小元素

由于栈具有先进后出的特点,push和pop也只能对栈顶元素进行操作。而题目要求的是在O(1)的时间复杂度求得最小元素,显然是不可以遍历求取的。这里可以用两个栈来实现,一个栈用来存取数据,另一个用来存栈...
  • afd_326
  • afd_326
  • 2016年07月06日 11:34
  • 538

O(1)求栈中最小值

  扩展栈O(1)求取最小值: (0)问题描述: (1)分析: (2)步骤: (3)代码实现: ------------------------ (0)问题描述:  扩展st...
  • legend050709
  • legend050709
  • 2014年06月08日 20:09
  • 715

求两个升序数组中最小元素差

题意描述:有两个升序的数组A,B 求|A[i]-B[j]|的最小值 解题思路:首先想到的是暴力解法,即内外双循环,逐一拿数组中的两元素作差,取最小的min,但这样做的时间复杂度达到了O(m*n)。所以...
  • u012050154
  • u012050154
  • 2016年03月24日 16:51
  • 927

交换两数组元素使两数组和差值最小

题目: 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小       很久之前就看到...
  • eagleatustb
  • eagleatustb
  • 2013年05月11日 23:24
  • 2135
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用差值求栈的最小元素
举报原因:
原因补充:

(最多只允许输入30个字)