继续上周的刷《剑指offer》之旅,本专栏博客依旧使用python实现
python的相关语法还需要练习
旋转数组的最小数字
题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
class Solution:
def minNumberInRotateArray(self, rotateArray):
if(len(rotateArray)==0):return 0
else:
for i in range(len(rotateArray)):
if(rotateArray[i]>rotateArray[i+1]):
return rotateArray[i+1]
斐波那契数列
题目描述:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
class Solution:
def Fibonacci(self, n):
fi2=0
fi1=1
if(n==0):
return fi2
if(n==1):
return fi1
for i in range(n-1):
fb=fi1+fi2
fi2=fi1
fi1=fb
return fb
使用递归无法解决这个问题,速度很慢而且达不到要求,因此需要使用循环实现
跳台阶
题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
对于这个问题,我们可以这样想:
- 青蛙跳上1级台阶,方法是1种,跳上2级台阶,方法是2种
- 对于n级台阶,可以先跳到n-1,再跳一级台阶,这种方法有f(n-1)个;也可以先跳到n-2,然后再跳两级台阶,这种方法有f(n-2)个。
- 这两种方法都是不重复的,因为至少最后一步是不同的,因此我们可以知道要跳上n级台阶,总共有不同的方法f(n-1)+f(n-2)(有点类似上一题的斐波那契数列)
class Solution:
def jumpFloor(self, n):
jp1=1 #跳一个台阶有一种跳法
jp2=2 #跳两个台阶有两种跳法,11,2
if(n==1):
return jp1
if(n==2):
return jp2
#跳n个台阶的跳法个数为 n-1个台阶的跳法个数 再跳一阶,或者n-2个台阶的跳法个数直接跳2阶
for i in range(n-2):
jp=jp1+jp2
jp1=jp2
jp2=jp
return jp
同样的,对于这种求解数列的,尽量不要使用递归的算法,速度跟内存都跟不上
变态跳台阶
题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
对于这个题,思路与上题大体类似:
- 首先,这只青蛙每次的步长可以是1-n中的任意一个数字
- 跳上1级台阶的方法有1种,2级台阶的方法有2种,三级台阶的方法有,【1-1-1】【1-2】【2-1】【3】有4种
- 对于跳上n级台阶,我们可以从n-i的任意一级位置直接一次跳i级台阶到达目标,其中i的取值为0-n,因此对于跳上n级台阶的方法有f(1)+f(2)+f(3)+…f(n-1)+1,其中最后f(k)表示先跳到k的位置,然后直接跳n-k级台阶到达目标,最后的1表示直接从起点一步跳到n位置
- 可以很容易发现上面的所有方法都是不重复的,因为至少最后一步的跳法不同
因此该问题就就转化为求前n-1项和的问题
class Solution:
def jumpFloorII(self,n):
if(n==1):
return 1
elif(n==2):
return 2
else :
jp=0
for i in range(1,n):#从f(1)累加到f(n-1)
jp=jp+self.jumpFloorII(i)
jp+=1
return jp
矩形覆盖
题目描述:
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
该题的思路同上两题:
- 首先n=1,方法为1,n=2方法为2【注意本题要考虑n=0的情况,方法为0】
- 对于拼n*2的矩阵,可以先拼2(n-1)的矩阵,然后右边摆上一个竖着的2 *1的矩阵,也可以先拼2(n-2)的矩阵,然后在右边摆上两个横着的2 *1的矩阵,因此对于n,总共方法有f(n-1)+f(n-2)
- 很容易证明,这两种方法是没有重叠的,因为至少最后两列不的摆放方法不同
class Solution:
def rectCover(self, n):
if(n==0):
return 0
if(n==1):
return 1
elif(n==2):
return 2
else:
re1=2
re2=1
for i in range(n-2):
re=re1+re2
re2=re1
re1=re
return re
该题也是一个类似斐波那契数列的数列