《剑指offer》python实现

继续上周的刷《剑指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

该题也是一个类似斐波那契数列的数列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值