5.用两个栈实现队列
题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
解题思路:
两个栈stackA,stackB,一个入栈,一处出栈,入栈时直接进入A,出栈时判断B是否有元素,有的话,出栈,没有的话,A中元素全部push(append)到B中,在pop出最上面一个元素。
代码:
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.stackA=[]
self.stackB=[]
def push(self, node):
# write code here
self.stackA.append(node)
def pop(self):
# return xx
if self.stackB:
return self.stackB.pop()
elif not self.stackA:
return None
else:
while self.stackA:
self.stackB.append(self.stackA.pop())
return self.stackB.pop()
6.旋转数组的最小数字
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解题思路:
从头遍历找最小值O(n)肯定不行,用到旋转数组的性质。旋转之后两个排序的子数组,前面子数组元素大于等于后面子数组元素。二分法O(logn)时间复杂度。
1 考虑数字没有重复情况下,二分法,两个指针,一个指向front,一个指向rear,midindex是中间数字,旋转数组的话,首位一定大于中间位,所以把指针从首位移动到中间位,前面数字向后移动,不断迭代,当首位和最后一位差1时,最后那位就是最小值,逐一排列,
2 数字有重复情况下,比如【1,1,0】,把首位移动后面,可以处理,或者中间位和末尾重,比如【1,0,0】
代码:
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if not rotateArray:
return 0
front ,rear =0, len(rotateArray)-1
midIndex=0
while rotateArray[front]>=rotateArray[rear]:
if rear - front ==1:
midIndex = rear
break
midIndex = (front+rear)//2
if rotateArray[front] == rotateArray[midIndex] and rotateArray[rear]== rotateArray[midIndex]:
return self.minOrder(rotateArray, front, rear)
if rotateArray[front] <= rotateArray[midIndex]:
front = midIndex
elif rotateArray[rear] >= rotateArray[midIndex]:
rear = midIndex
return rotateArray[midIndex]
def minOrder(self, array, front, end):
result = array[0]
for i in array[front: end+1]:
if i < result:
result = i
return result
7斐波那契数列
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
解题思路:
数组存储 or 利用range()
代码:
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
result = [0,1]
while len(result) <= n:
result.append(result[-1]+result[-2])
return result[n]
class Solution:
def Fibonacci(self, n):
if n<=0:
return 0
if n==1:
return 1
else:
a,b=0,1
for i in range(n-1):
a,b=b,a+b
return b