利用差值求栈的最小元素

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


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

求栈的最小元素

题目来源:http://bbs.csdn.net/topics/350118968 2.设计包含min函数的栈。 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。 要求函数min、p...

leetcode求栈中最小的元素

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

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

[算法]求栈中最小元素

如何用O(1)的时间复杂度求栈中最小元素解题思路: 我们经常会采用空间换取时间提高时间复杂度。我们可以使用两个栈结构,一个栈用来存储数据,另一个栈用来存储栈中的最小元素。思路如下:如果当前入栈的元...

dfs 求差值最小

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

带有取最小元素的栈,要求压栈、出栈、取最小元素时间复杂度O(1)

题目:设计包含min函数的栈。定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。头文件如下:/****************...

求K个最小元素

算法: 1 排序后取前K个算法,比较笨 2排序算法中有些通过取本次循环最小的K实现排序的,因此排下前K个元素就可以实现取得最小的K个元素,比如selectionSort、bubbleSort、he...

【面试】求数组元素最大差值的问题

一、问题描述: 如果一个人在知道了股票每天的股价以后,对该股票进行投资,问什么时候买入和卖出(注意这里有先后顺序)能取得最大的收益。其数学模型就是,给定一个整数数组,a[1],a[2],...,a[...

包含最小元素的栈

题目:设计包含min函数的栈。 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。 要求函数min、push以及pop的时间复杂度都是O(1)。 文件分布: 头文件和main文件...

包含min函数的栈

问题:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min、push及pop的时间复杂度都是O(1)。     详细的代码实现如下: #include #in...

包含min函数的栈

【题目】 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的的min函数。在该栈中,调用min\push\pop的时间复杂度都为O(1)。【分析】 对于本题,如果想要在实时得到栈中数据的...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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