用两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
思路
- 解法1
将stack作为存储空间,temp作为临时缓冲区
入队:直接压入stack
出队:将stack中的元素全部压入temp中,再将temp的栈顶元素弹出,最后将temp中的元素再倒回到stack中。 - 解法2
含等待池的先到先服务
入队时,直接压入stack
出队时,判断temp是否为空,如果temp为空,释放stack中的等待池,即将stack中的 元素倒入temp中,执行出队操作。如果temp不为空,直接出队。 - 镜像问题:两个队列实现栈
入栈,将元素进队列A
出栈,判断队列A中的个数是否为1,如果等于1,则出队列。否则将队列A中的元素,放入队列B中,直到队列A中的元素留下一个,然后队列A出队,再把队列B中的元素返回到A中。待补充
代码
# -*- coding: utf-8 -*-
class Solution:
def __init__(self):
self.stack,self.temp = [],[]
def push(self,node):
self.stack.append(node)
def pop1(self):
if self.stack is None:
return
while self.stack:
self.temp.append(self.stack.pop()) #将栈内元素弹出到辅助栈,首元素是辅助栈的栈顶元素
res = self.temp.pop()
while self.temp:
self.stack.append(self.temp.pop()) #将辅助栈内元素返回到栈中,恢复入栈顺序
return res
def pop2(self):
if not self.temp: #如果缓冲区为零
while self.stack: #就将栈内元素全部弹出到缓冲区
self.temp.append(self.stack.pop())
return self.temp.pop()
if __name__ == "__main__":
solution = Solution()
for i in range(10):
solution.push(i)
for i in range(10):
print solution.pop1(),
旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路
输入是一个旋转数组[3,4,5,1,2],输出是原数组[1,2,3,4,5]的最小值。由于原数组非减排序,原数组的首元素不大于其他元素值,因此本题可以利用单调性求解。旋转数组中单调性发生改变的后一位置就是最小数字。
- 特殊情况:
1.等值数组,数组遍历结束,单调性不发生改变,返回首元素;
2.单元素数组,数组遍历结束(遍历一次),if语句为真不满足,返回首元素;
代码
# -*- coding: utf-8-*-
class Solution:
def minNumberInRotateArray(self,rotateArray): #顺序遍历复杂度为O(n)
if not rotateArray:
return 0
for i in range(len(rotateArray)-1):
if rotateArray[i] > rotateArray[i+1]: #出现降序
return rotateArray[i+1]
return rotateArray[0] #特殊情况,数组等值或者单元素数组
if __name__ == "__main__":
rotateArray1 = [3,4,5,1,2]
rotateArray2 = [2,2,2,2,2]
rotateArray3 = [3]
solution = Solution()
print solution.minNumberInRotateArray(rotateArray1)
print solution.minNumberInRotateArray(rotateArray2)
print solution.minNumberInRotateArray(rotateArray3)