第 8 天
动态规划 Dynamic programming
这道题一上来我就是一个递归,啪的一下很快啊就是给我一个超时
class Solution:
def fib(self, n: int) -> int:
if n == 0 or n == 1:
return n
return (self.fib(n-1)+self.fib(n-2))%1000000007
因为递归是指数级别的复杂度,存在大量重复运算,没有用到动态规划的思想
贴一个正确答案:
class Solution:
def fib(self, n: int) -> int:
if n == 0 or n == 1:
return n
a = 1
b = 0
for i in range(1,n):
a += b
b = a - b
a %= 1000000007
return a
这道题本质上是一个斐波那契数列,因为我们跳第n级台阶的时候可以从第n-1节台阶跳一步,或者从n-2节台阶跳两步,假设到第n-2级的方式有 f(n-2)种,到第n-1级的方式有f(n-1)种,则到第n级的方式有:f(n-2)*1+f(n-1)*1=f(n-2)+f(n-1)。
class Solution:
def numWays(self, n: int) -> int:
if n == 0 or n == 1:
return 1
if n == 2:
return 2
a = 2
b = 1
for i in range(2,n):
a += b
b = a - b
a %= 1000000007
return a
在遍历数组的过程中,维护一个最小值,最小值初试为prices[0]
- 如果prices[i]大于min,则去更新一下利润res
- 否则说明当前的prices[i]比min还小,则更新min
class Solution:
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
if n == 0:
return 0
min_price = prices[0]
max_ = 0
for i in range(n):
if prices[i]<min_price :
min_price = prices[i]
else:
max_ = max(max_,prices[i]-min_price)
return max_