维护了一个排序的栈。
def __init__(self): self.stack=[] self.sortedstack=[] def push(self, node): # write code here self.sortedstack.append(node) self.stack.append(node) if len(self.sortedstack)>1: i=len(self.sortedstack)-1 while i!=0: if self.sortedstack[i]<self.sortedstack[i-1]: self.sortedstack[i],self.sortedstack[i-1]=self.sortedstack[i-1],self.sortedstack[i] i=i-1 else: break def pop(self): # write code here value=self.stack[-1] self.stack=self.stack[:-1] print(self.sortedstack) if len(self.sortedstack)==1: self.sortedstack=[] else: left=0 right=len(self.sortedstack)-1 while left<=right: mid=(right-left)//2+left if self.sortedstack[mid]<value: left=mid+1 elif self.sortedstack[mid]>value: right=mid-1 elif self.sortedstack[mid]==value: break print(mid) if mid == len(self.sortedstack)-1: self.sortedstack=self.sortedstack[:-1] else: for i in range(mid+1,len(self.sortedstack)): self.sortedstack[i-1]=self.sortedstack[i] self.sortedstack=self.sortedstack[:-1] return value def top(self): # write code here return self.stack[-1] def getMin(self): # write code here return self.sortedstack[0]
因为求最小值需要遍历数组时间复杂度为o(n),此题要求o(1)所以是一道空间换时间的题,需要维护一个当前最小值的栈,每次push元素的时候,也需要将当前的最小值放入最小值栈中,然后pop元素的时候也需要将对应的最小值pop出去。在pop的时候也要维护self.minvalue的变量值,如果数组没有值了,需要将其置为float('inf')。
# -*- coding:utf-8 -*- def __init__(self): self.stack=[] self.minstack=[] self.minvalue=float('inf') def push(self, node): # write code here self.stack.append(node) if node<=self.minvalue or len(self.minstack)==0: self.minstack.append(node) self.minvalue=node else: self.minstack.append(self.minvalue) def pop(self): # write code here value=self.stack[-1] self.stack=self.stack[:-1] self.minstack=self.minstack[:-1] if len(self.minstack)==0: self.minvalue=float('inf') else: self.minvalue=self.minstack[-1] return value def top(self): # write code here return self.stack[-1] def getMin(self): # write code here return self.minstack[-1]
可以压缩最小值栈,当最小值相同的时候只存储一个就行,pop的时候,注意当两个栈顶的值都相同的时候才把最小值栈的元素pop出去,否则继续保留。注意最开始入栈float('inf')
class Solution: def __init__(self): self.stack=[] self.minstack=[float('inf')] self.minvalue=float('inf') def push(self, node): # write code here self.stack.append(node) if node<self.minvalue: self.minstack.append(node) self.minvalue=node def pop(self): # write code here value=self.stack[-1] self.stack=self.stack[:-1] if value==self.minstack[-1]: self.minstack=self.minstack[:-1] return value def top(self): # write code here return self.stack[-1] def min(self): # write code here if self.stack[-1]<self.minstack[-1]: return self.stack[-1] return self.minstack[-1]
只使用一个栈来完成任务,当入栈元素小于当前最小元素时说明当前的最小元素需要改变,所以将之前的最小元素也入栈,便于后面查找,当出栈的时候,当出栈值等于当前最小值的时候,说明当前的最小值需要改变,所以应该去找栈中之前的最小值。
class Solution: def __init__(self): self.stack=[] #self.minstack=[] self.minvalue=float('inf') def push(self, node): # write code here if node<=self.minvalue: self.stack.append(self.minvalue) #self.minstack.append(node) self.minvalue=node self.stack.append(node) def pop(self): # write code here value=self.stack[-1] self.stack=self.stack[:-1] if value==self.minvalue: self.minvalue=self.stack[-1] self.stack=self.stack[:-1] return value def top(self): # write code here return self.stack[-1] def min(self): # write code here return self.minvalue
存储入栈值与最小值之间的差值,起初设置最小值为float('inf'),当栈是空的时候,将最小值设置为最开始入栈的元素,然后先入栈当前值与最小值的差值,当当前值比最小值还要小的时候,更换最小值;当出栈的时候,判断当前元素是正数还是负数,如果是负数的话,就说明当前值小于最小值,所以需要更换最小值,通过value-=diff ,当差值是正数时,说明最小值不用更换。注意这种方法在返回top元素的时候不能简单的返回栈顶的元素,而是需要判断,当元素小于0时,说明当前的最小值就是栈顶的元素,当元素大于0需要使用最小值加上差值得到原来的元素。
这种情况存在 最大值减去最小值,会溢出的问题。
# -*- coding:utf-8 -*- class Solution: def __init__(self): self.stack=[] #self.minstack=[] self.minvalue=float('inf') def push(self, node): # write code here if len(self.stack)==0: self.minvalue=node self.stack.append(node-self.minvalue) if self.minvalue>node: self.minvalue=node def pop(self): # write code here value=self.stack[-1] self.stack=self.stack[:-1] if value<0: self.minvalue=self.minvalue-value return value def top(self): # write code here if self.stack[-1]<0: return self.minvalue return self.stack[-1]+self.minvalue def getMin(self): # write code here if len(self.stack)==0: return None return self.minvalue