剑指 Offer 63. 股票的最大利润

 剑指 Offer 63. 股票的最大利润icon-default.png?t=M666https://leetcode.cn/problems/gu-piao-de-zui-da-li-run-lcof/

解题思路:
设共有 n 天,第 a 天买,第 b天卖,则需保证 a < b(因为卖出需大于买入,不能买了接着卖) ;可

第1天买,可以第2天卖,第3天卖,...,第n天卖,总共(n-1)种交易方案

第2天买,可以第3天卖,第4天卖,...,第n天卖,总共(n-2)种交易方案

。。。

推出交易方案数共有:
(n - 1) + (n - 2) +。。。 + 2 + 1 = n(n - 1) / 2

因此,暴力法的时间复杂度为 O(n^2)O(n 
2考虑使用动态规划降低时间复杂度,以下按照流程解题。
动态规划解析:
状态定义: 设动态规划列表 dp ,dp[i] 代表以 prices[i]为结尾的子数组的最大利润,

即第i天卖出的最大利润。
转移方程: 由于题目限定 “买卖该股票一次” ,因此第i 日卖出的最大利润 dp[i]等于第 i - 1天最大利润 dp[i-1] 和第 i天卖出的最大利润中的最大值。
第i 日最大利润 = max(第 (i-1) 日最大利润, 第 i 日价格 - 前 i 日最低价格)
前i日最大利润=max(前(i−1)日最大利润,第i日价格−前i日最低价格)
dp[i]=max(dp[i−1],prices[i]−min(prices[0:i]))

初始状态: dp[0] = 0 ,即首日利润为 0 ;
返回值: dp[n - 1]] ,其中 n为 价格列表长度。

 

'''
class Solution:
    def maxProfit(self,lst):
        #cost=float("inf")
        dp=[0]
        for i in range(1,len(lst)):
            #dp[i]=max(dp[i-1],lst[i]-min(lst[0:i]))
            dp.append(max(dp[i-1],lst[i]-min(lst[0:i])))
        return dp[len(lst)-1]
'''
'''
class Solution:
    def maxProfit(self,lst):
        if not lst:return 0#提交代码调试出来的
        dp=[0]
        cost=lst[0]
        for i in range(1,len(lst)):
            #dp[i]=max(dp[i-1],lst[i]-min(lst[0:i]))
            cost=min(cost,lst[i])
            dp.append(max(dp[i-1],lst[i]-cost))
        return dp[len(lst)-1]
'''
class Solution:
    def maxProfit(self,lst):
        cost,profit=float("inf"),0
        for price in lst:
            cost=min(cost,price)
            profit=max(profit,price-cost)
        return profit
a=Solution()
lst1=[7,1,5,3,6,4]
lst2=[7,6,4,3,1]
print(a. maxProfit(lst1))
print(a. maxProfit(lst2))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值