由于没有其他说明,我认为如果在64位系统上将推送到堆栈上的整数范围限制为32位,则可能包括一个解决方案。
我知道这些限制可能不适用,但我会把它留在这里,以防它引发其他想法。
注意 如果堆栈值不仅限于整数,则也可以类似地使用元组,其中x的推送将是(min_thus_far,x)的推送,例如。
arr = [10, 7, 15, 12, 3, 21]
main_stack = []
def get_min():
if len(main_stack) == 0:
return None
return main_stack[-1] >> 32
def push(key):
current_min = get_min()
if current_min:
if key < current_min:
current_min = key
else:
current_min = key
main_stack.append(key + (current_min << 32))
def pop():
key = main_stack.pop()
return key & 0xFFFFFFFF
for key in arr:
push(key)
def print_state():
print(", ".join(str(x & 0xFFFFFFFF) for x in main_stack))
print("min: %d" %(get_min(),))
for _ in arr:
print_state()
print "popped:", pop()
OUTPUT:
10, 7, 15, 12, 3, 21
min: 3
popped: 21
10, 7, 15, 12, 3
min: 3
popped: 3
10, 7, 15, 12
min: 7
popped: 12
10, 7, 15
min: 7
popped: 15
10, 7
min: 7
popped: 7
10
min: 10
popped: 10
这里是一个元组版本:
arr = [10, 7, 15, 12, 3, 21]
main_stack = []
def get_min():
if len(main_stack) == 0:
return None
return main_stack[-1][0]
def push(key):
current_min = get_min()
if current_min:
if key < current_min:
current_min = key
else:
current_min = key
main_stack.append((current_min, key))
def pop():
key = main_stack.pop()
return key[1]
for key in arr:
push(key)
def print_state():
print(", ".join(str(x[1]) for x in main_stack))
print("min: %d" %(get_min(),))
for _ in arr:
print_state()
print "popped:", pop()
pop
可能需要以O(N)时间运行,而不是传统堆栈的O(1)。如果您愿意使用堆将所有内容存储在堆栈中,您可以将其降至O(logN),但代价是内存。 - mgilsonmin()
,具体有什么优势呢? - Klaus D.push() == 常数时间
和get_min() == 常数时间
,因此将最小值入栈和获取最小值的操作都是常数时间。常数时间指的是与堆栈大小相关的时间变化,在这种实现方式中,这些函数的执行时间不会随着堆栈的大小而改变。 - sberry