剑指offer 07——斐波拉契数列
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
n ≤ 39
解题思路
斐波拉契数列
a0 = 0,a1 = 1,an = an-1 + an-2;
可用动态规划解决
算法优化,空间优化,无需存储每个状态
代码
int Fibonacci(int n) {
if(n == 0)
return 0;
if(n == 1)
return 1;
vector<int> dp(n+1, 0);
dp[1] = 1;
for(int i = 2; i <= n; ++i) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
剑指offer 08——跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
解题思路
动态规划
设位于位置m,有f(m)种方式
当位于n-1的位置时,有f(n-1) = 1种
当位于n-2的位置时,有f(n-2) = 2种
当低于n-3的位置时,有f(n-3) = f(n-3+1) + f(n-3+2) = 3
代码如下
代码
int jumpFloor(int number) {
if(number == 0)
return 0;
else if(number == 1)
return 1;
else if(number == 2)
return 2;
vector<int> nums(number+1, 0);
nums[1] = 1;
nums[2] = 2;
for(int i = 3; i <= number; ++i) {
nums[i] = nums[i-1] + nums[i-2];
}
return nums[number];
}
剑指offer 09——变态跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解题思路
动态规划
设位台阶高度为n,有f(n)种方式
当n=1时,有1种
当n=2时,有f(1)+1种
当n=3时,有f(2) + f(1) + 1种
即f(n) = f(n-1) + f(n-2) + f(n-3) + f(1) + 1
代码如下
代码
int jumpFloorII(int number) {
if(number <= 1) return 1;
vector<int> dp(number + 1, 0);
dp[0] = dp[1] = 1;
for(int i = 2; i <= number; ++i) {
for(int j = 0; j < i; ++j) {
dp[i] += dp[j];
}
}
return dp[number];
}
剑指offer 10——矩形覆盖
题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
比如 n=3 时,2 * 3的矩形块有3种覆盖方法:
解题思路
动态规划
设长度为为n,有f(n)种方式
.
n = 1时,有一种方式
n = 2时,有两种方式
n = 3时,竖着放一块有f(2)种;横着放一块,有f(1)种;
f(n) = f(n-1) + f(n-2)
代码
int rectCover(int number) {
if(number == 0 || number == 1)
return number;
vector<int> res(number + 1, 0);
res[0] = res[1] = 1;
for(int i = 2; i <= number; ++i)
res[i] += (res[i-1] + res[i-2]);
return res[number];
}**加粗样式**