在面试中被问到:
设计一种数据结构,使所有这些操作在常数时间 O(1)
内完成:
- 推入元素
- 弹出元素
- 元素范围:查找当前元素的最小区间范围。
例如:[1, 22, 44, 56, 99, 98, 56]
的范围是98
。
我使用了自定义堆栈和两个变量 max
和 min
设计这个数据结构,但是在弹出最小或最大元素后不起作用。
我尝试过:
我使用了一个带有两个额外变量 max 和 min 的堆栈:
DS
{
top, //Top of the Stack
min, //Min till now
max //Max till now
}
Push(DS, elem)
Push_Stack(DS.top, elem)
if elem < DS.min
DS.min = elem
if elem > DS.max
DS.max = elem
Range(DS)
return DS.max - DS.min
Pop(DS)
x = Pop_Stack(DS.top)
if (x == DS.min)
DS.min = Find_New_Min(DS.top) //This takes linear time using this approach
if (x == DS.max)
DS.max = Find_New_Max(DS.top)
Pop()
函数需要找到新的最小值或最大值,这是一个问题 - 目前的实现方式下,Pop()
不是 O(1) 操作。你可以通过向栈中添加信息来解决这个问题 - 栈不一定只包含被推入的元素。 - Michael Burr