剑指offer刷题(五)——旋转数组的最小数字
题目
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路
数组的最小值相当于作为两个非递减排序数组的分界,且第一个数组里的元素永远都大于等于第二个数组里的元素.也就是说我们得到一个序列,该序列的第一个元素肯定大于等于最后一个元素.我们可以考虑二分查找法.先找中间数,中间数若大于等于原序列的第一个元素且小于原序列的最后一个元素则这个中间数包含在第一个非递减数组中,所以最小元素在中间数的右侧序列中.反之则在左侧序列中.应该也会遇到这种情况:中间数等于第一个数和最后一个数.这样无法得到最小元素会在左侧还是右侧,则只能顺序查找了
C++
1 |
|
1 | #剑指offer刷题(六)——斐波那契数列 |
Python1
2
3
4
5
6
7
8
9
10class Solution:
def Fibonacci(self, n):
# write code here
A=[0,1,1]
if(n<=2):
return A[n]
else:
for i in range(3,n+1):
A.append(A[i-1]+A[i-2])
return A[n]
剑指offer刷题(七)——跳台阶
题目
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路
已知青蛙得跳分为两种,跳一级与跳两级.我们现在要求跳到第n级有几种跳法?因为跳到n级的前一步只可能出现在第n-1级和第n-2级.所以也有斐波那契形式f(n)=f(n-1)+f(n-2)
C++
1 |
|
Python
斐波那契的变体1
2
3
4
5
6
7
8
9class Solution:
def jumpFloor(self, number):
# write code here
A=[0,1,2]
if(number<=2):
return A[number]
for i in range(3,number+1):
A.append(A[i-1]+A[i-2])
return A[number]
剑指offer刷题(八)——变态跳台阶
题目
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路
已知:
f(n)=f(n-1)+f(n-2)+…+f(1)+1
f(n-1)=f(n-2)+…..+f(1)+1
则:
f(n)=2(f(n-2)+…+f(1)+1)
推导可得
$f(n)=2^{(n-1)}$
所以求解该跳法有直接的公式可以得出
C++
1 |
|
Python
也是斐波那契的变体,注意要加上1,1是一下子直接跳上N1
2
3
4
5
6
7
8
9
10class Solution:
def jumpFloorII(self, number):
# write code here
A=[0,1,2,4]
if(number<=3):
return A[number]
else:
for i in range(4,number+1):
A.append(sum(A)+1)
return A[number]