利用差值求栈的最小元素

原创 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;
	}
}


相关文章推荐

O(1)求栈中最小值

  扩展栈O(1)求取最小值: (0)问题描述: (1)分析: (2)步骤: (3)代码实现: ------------------------ (0)问题描述:  扩展st...

实现一个栈,实现入栈,出栈,求最小值,时间复杂度为O(1)

题目: 实现一个栈,实现入栈,出栈,求栈中最小值,时间复杂度为O(1) 方案一: 设计栈中元素类型为一个包含元素值和当前栈中所有元素的最小值的对象 入栈时,将对象入栈,当前元素的值小于栈中最小...

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

常数时间求栈的最大值 问题描述: 一个栈stack,具有push和pop操作,其时间复杂度皆为O(1)。 设计算法max操作,求栈中的最大值,该操作的时间复杂度也要求为O(1)。 ...

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

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

leetcode求栈中最小的元素

55. Min Stack   QuestionEditorial Solution  My Submissions Design a stack that supports push, pop...

交换两个数组的元素使之总和的差值最小

题目描述:               有两个数组a,b,大小都为n,数组元素的值任意整形数,无序;               要求:通过交换a,b中的元素,使[数组a元素的和]与[数组b元素的...

每日AC-- 美团 -- 最大差值 | leetcode-求树最小深度 | 网易招聘笔试(升级之路)

美团  -- 最大插值 题目描述 有一个长为n的数组A,求满足0≤a≤b 给定数组A及它的大小n,请返回最大差值。 测试样例: [10,5],2 返回:0 没什么要说的 ,简...

dfs 求差值最小

题目详情: 有n个人,m种技能,每个人学会某项技能都需要一定的时间。每个人可以选择一项感兴趣得技能学习。 你的任务是,给每个人分配一个他学习的技能,使得学得最快的人和最慢的人的时间差距最小。 ...

poj3522求一棵生成树使最大的边和最小的边差值最小

/*题目:给出一张图,求一棵生成树使得最大边权和最小边权差值最小*/ /*思路:对边权排序,依次枚举最小边,再与后边组成生成树,直到满足题意。若不连通,输出-1,反之,输出差值*/ #include...

算法--06年华为面试:求两个数组的最小差值(Java实现)

Q题目华为06年面试题(要求8分钟完成)
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用差值求栈的最小元素
举报原因:
原因补充:

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