1、斐波那契数列

问题描述

写一个函数,输入​​n​​​ ,求斐波那契(Fibonacci)数列的第​​n​​ 项。斐波那契数列的定义如下:

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

斐波那契数列由​​0​​​和​​1​​开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模​​1e9+7​​​ ​​1000000007​​​,如计算初始结果为:​​1000000008​​​,请返回 ​​1​​。

示例 1:

输入:n = 2
输出:1

示例 2:

输入:n = 5
输出:5

提示:

0 <= n <= 100

解题思路

  • 使用递归和迭代,但是递归会超出时间限制。
  • python语言的整型数值没有大小限制,只要计算机内足够就可以,C++有限制,需要及时取余。

代码实现

class Solution {
public:
int fib(int n) {
if(n == 0)
return 0;
if(n == 1)
return 1;
long long num1 = 0, num2 = 1;
long long ans = 0;
for(int i = 2; i <= n; i++){
ans = (num1 + num2) % (int)(1e9 + 7); // 因为最后的结果就是取余
num1 = num2;
num2 = ans;
}
return ans;
}
};
class Solution:
def fib(self, n: int) -> int:
if n == 0:
return 0
if n == 1:
return 1
ans, num1, num2 = 0, 0 ,1
for i in range(2, n + 1):
ans = num1 + num2
num1 = num2
num2 = ans
return ans % (int)(1e9 + 7)

2、青蛙跳台阶问题

一只青蛙一次可以跳上​​1​​​级台阶,也可以跳上​​2​​​级台阶。求该青蛙跳上一个 ​​n​​ 级的台阶总共有多少种跳法。

答案需要取模 ​​1e9+7(1000000007)​​​,如计算初始结果为:​​1000000008​​​,请返回 ​​1​​。

示例 1:

输入:n = 2
输出:2

示例 2:

输入:n = 7
输出:21

提示:

0 <= n <= 100

代码实现

class Solution {
public:
int numWays(int n) {
if(n == 0 or n == 1)
return 1;
if(n == 2)
return 2;
long long ans = 0, r1 = 1, r2 = 2;
for(int i = 3; i <= n; i++){
ans = (r1 + r2) % (int)(1e9 + 7);
r1 = r2;
r2 = ans;
}
return ans;
}
};

3、使用最小花费爬楼梯(动态规划)

本题目需重点掌握!!!

问题描述

数组的每个索引作为一个阶梯,第 ​​i​​​个阶梯对应着一个非负数的体力花费值 ​​cost[i]​​​(索引从​​0​​开始)。

每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。

您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为​​0​​​ 或 ​​1​​ 的元素作为初始阶梯。

示例 1:

输入: cost = [10, 15, 20]
输出: 15
解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15。

示例 2:

输入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
输出: 6
解释: 最低花费方式是从cost[0]开始,逐个经过那些1,跳过cost[3],一共花费6。

注意:

cost 的长度将会在 [2, 1000]。
每一个 cost[i] 将会是一个Integer类型,范围为 [0, 999]。

解题思路

  • 本题目是一道动态规划类型题目。状态转移方程为:LeetCode斐波那契数列、青蛙跳台阶、爬楼梯(C++,python)_斐波那契数列
  • 定义LeetCode斐波那契数列、青蛙跳台阶、爬楼梯(C++,python)_代码实现_02LeetCode斐波那契数列、青蛙跳台阶、爬楼梯(C++,python)_斐波那契数列_03分别代表一次爬上一个台阶时的最少消耗一次爬上两个台阶时的最少消耗。开始LeetCode斐波那契数列、青蛙跳台阶、爬楼梯(C++,python)_代码实现_02LeetCode斐波那契数列、青蛙跳台阶、爬楼梯(C++,python)_斐波那契数列_03代表LeetCode斐波那契数列、青蛙跳台阶、爬楼梯(C++,python)_最优解_06LeetCode斐波那契数列、青蛙跳台阶、爬楼梯(C++,python)_代码实现_07的旧值。每次从后向前迭代,LeetCode斐波那契数列、青蛙跳台阶、爬楼梯(C++,python)_代码实现_02LeetCode斐波那契数列、青蛙跳台阶、爬楼梯(C++,python)_斐波那契数列_03更新为LeetCode斐波那契数列、青蛙跳台阶、爬楼梯(C++,python)_代码实现_10LeetCode斐波那契数列、青蛙跳台阶、爬楼梯(C++,python)_最优解_06的新值。最后的LeetCode斐波那契数列、青蛙跳台阶、爬楼梯(C++,python)_最优解_12LeetCode斐波那契数列、青蛙跳台阶、爬楼梯(C++,python)_斐波那契数列_13代表着从第一个台阶开始的最优解和从第二个台阶开始的最优解,返回最终结果的最优解即为最少消耗爬楼梯问题。

代码实现

class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int f1 = 0, f2 = 0;
for(int i = cost.size() - 1; i >= 0; i--){
int f0 = cost[i] + min(f1, f2);
f2 = f1;
f1 = f0;
}
return min(f1, f2);
}
};

运行截图

LeetCode斐波那契数列、青蛙跳台阶、爬楼梯(C++,python)_最优解_14