用两个栈实现队列&&旋转数组的最小数字

用两个栈实现队列

用两个栈来实现一个队列,完成队列的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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值