http://www.cnblogs.com/xing901022/p/3771088.html
(剑指offer面试题21)
目的:为快速得到min,需要存储min
维持题目条件的完整性:栈,其性质:出栈、入栈
出栈、入栈对min带来的影响:min会变化。
出栈:min没出,min不变;min出了,新的min是?
这里的误区:min出了,新的min是第二小元素。错误,因为min出了,min可能不变,栈中还有等于min的元素(此处要求思维严密性)。
那么min出了,难道要看栈内还有没有等于min的元素吗?不,这样会很麻烦。这时思路容易复杂化。
当复杂化时,不要盲目继续复杂考虑,要深入问题本质,要简单化。
出栈的本质是什么?注意到出栈、入栈是相反、对称的动作,其本质应该是一样的。不应该孤立的考虑出栈或者入栈,应该综合、统一起来。它们的共同点是?
要知道出栈之后min是什么,需要知道,出栈之后,栈的状态是什么?是个什么样的栈?
对,是之前的一个栈,就是最近的一个历史栈,就像昨天一样。
之前那个栈的min是多少?可以记录下来。如果你记录的是第二小的值,你记录的不是之前那个栈的最小值。
弹出一个值时,也就是栈恢复到上一个历史版本,辅助栈应该是最小值的历史版本。
栈的本质是时间序列。出栈入栈是时间(栈状态)的前后推移。为了维持栈的性质,同时达到业务需求(也就是题目要求),必须在处理业务信息的结构中加入栈的性质的考虑。
栈被用在多层函数调用中,也是应用其保存时间序列的性质。
注意到这个问题,其实用到了递归思想,在动态中,往往需要找到相似的子问题,这对解决问题大有帮助。
本文详细阐述了如何利用栈结构高效地维护最小元素,通过理解出栈、入栈操作对最小元素的影响,揭示了正确记录历史栈最小元素的重要性,以及如何简化思维过程来避免复杂化。同时,强调了递归思想在解决类似问题中的应用,突出了时间序列在栈操作中的关键作用。
3万+

被折叠的 条评论
为什么被折叠?



