剑指0ffer—67道在线编程—jz6~jz10
jz6 旋转数组的最小数字
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
题目链接
思路分析:
此题目旨在找最小元素
最笨的办法,暂定最小元素为数组中第一个元素,记为q;
依次遍历数组,若后面元素p比暂定的最小元素q小,则q=p
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
#分情况讨论
#若数组大小为0,满足题意:则返回0
if len(rotateArray)==0:
return 0
# 若数组长度为1,则直接返回元素
elif len(rotateArray)==1:
return rotateArray[0]
else:
for i in range(0,len(rotateArray)):
'''
假定数组中第一个元素最小,记为q
依次遍历数组,若后面元素p比暂定的最小元素q小,则q=p
'''
p = rotateArray[i]
q = rotateArray[0]
if p<q:
q=p
break
return q
二分查找
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
left=0
right=len(rotateArray)-1
while left<right:
mid=left+(right-left)//2
if rotateArray[mid]>rotateArray[right]:
left=mid+1
else:
right=mid
return rotateArray[left]
jz7 斐波那契数列
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
n<=39
思路分析:
-
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*),这个数列从第三项开始,每一项都等于前两项之和。
-
在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,斐波那契数列详解
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
f0,f1=0,1
if n==0:
return f0
elif n==1:
return f1
else:
for i in range(2,n+1):
f_next = f0+f1
f0=f1
f1=f_next
return f_next
jz8 跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
详情见之前刷题之2020-05-26-力扣刷刷3-70.爬楼梯
jz9 变态跳台阶—jz8的升级
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路分析:
发现规律:f(n)=2f(n-1)
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
# write code here
f1=1
if number<=0:
return False
elif number==1:
return 1
else:
for i in range(2,number+1):
f_next=2*f1
f1=f_next
return f_next
jz10 矩形覆盖
题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
比如n=3时,2*3的矩形块有3种覆盖方法:
题目链接
思路分析:
自我感觉这是一道找规律的题型,在分析前不知道是什么序列,所以可以先看一下n=1,n=2,n=3,n=4的情况摸索规律,主要是看一下 n 和 n-1 是否存在一些隐含联系。
- 当 n < 1时,显然不需要用2*1块覆盖,按照题目提示应该返回 0。
- 当 n = 1时,只存在1种情况。
- 当 n = 2时,存在2种情况。
- 当 n = 3时,存在3种情况。
- 当 n = 4时,存在5种情况。
- …
- 归纳发现此序列规律: f(n) = f(n-1) + f(n-2), (n > 2)。此序列也就相当于斐波那契数列。
解决此题也就要使用递归算法
如下图所示
# -*- coding:utf-8 -*-
class Solution:
def rectCover(self, number):
# write code here
f1,f2=1,2
if number==0:
return 0
elif number==1:
return 1
elif number==2:
return 2
else:
for i in range(3,number+1):
f_next=f1+f2
f1=f2
f2=f_next
return f_next