「这是我参与2022首次更文挑战的第40天,活动详情查看:2022首次更文挑战」
[剑指 Offer 10- II. 青蛙跳台阶问题]
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
-
输入:n = 2
-
输出:2
-
示例 2:
-
输入:n = 7
-
输出:21
-
示例 3:
-
输入:n = 0
-
输出:1
-
提示:
0 <= n <= 100
解题思路:
- 这个题和昨天遇到的斐波那契数列很相似
- 首先判断特殊情况,n为0 和 1,2 的情况
- 看到动态规划的题,我们的思路就是先来个dp=[1,1]
- 遍历2到n+1个数,将数存入dp中,dp的数量和为dp[i-1]+dp[i-2]的规律和
class Solution:
def numWays(self, n: int) -> int:
if n == 0:
return 1
if n<2:
return n
dp = [1, 1]
for i in range(2, n + 1):
dp.append(dp[i - 1] + dp[i - 2])
return dp[n] % 1000000007
执行结果:
[剑指 Offer 63. 股票的最大利润]
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
示例 1:
输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。 示例 2:
输入: [7,6,4,3,1] 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
限制:
0 <= 数组长度 <= 10^5
解题思路:
- 动态规划问题
- 先判断prices 是否存在,不存在直接返回 0
- 碰到这样的问题还是先来设置一个dp的列表
- 先获取初始值,我这里用left代替,left就是最左侧的值即prices[0]
- 遍历所有prices
- 比较left, prices[i] 取最小值,因为要利益最大化,所有左侧的值始终要取最小值
- dp[i]获取dp[i - 1], prices[i] - left 中的最大值,保证每次存储都是最大的利益值
- dp[-1]就是我们要的值
class Solution:
def maxProfit(self, prices: List[int]) -> int:
if not prices:
return 0
dp = [0 for row in range(len(prices))]
left = prices[0]
for i in range(1, len(prices)):
left = min(left, prices[i])
dp[i] = max(dp[i - 1], prices[i] - left)
return dp[-1]