博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法】动态规划算法—买卖股票的最佳时机系列(1-4)
阅读量:4088 次
发布时间:2019-05-25

本文共 3109 字,大约阅读时间需要 10 分钟。

买卖股票的最佳时机—1:

题目:

假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。

如果你最多只允许完成一次交易,设计一个算法来找出最大利润。

解法:

该题解法和最大连续子数组和的解法思路是一样的。

1、根据股票的利益意义,想要更多利益则值低时买进,值高时卖出。根据提供的股票价格不方便得出股票价格变化,对原数据进行计算:list[i] - list[i-1] = 股票的变化。变化为正时股票增长(存在利益),变化为负时股票为下跌(无利益)。

2、得到股票的变化值列表,即求最大子数组和,最后得到正解。

 

代码:时间O(n),空间O(1)

 

 
  1. def maxProfit1(list):

  2. # 算出利益比变化列表

  3. NEW=[]

  4. for i in range(len(list)-1):

  5. NEW.append(list[i+1]-list[i])

  6. # 初始化

  7. imax = 0

  8. temp = 0

  9. # 最大子数组和计算方式

  10. for d in NEW:

  11. if temp + d > 0:

  12. temp += d

  13. else:

  14. temp = 0

  15. # 获取当前最大子数组

  16. imax = max(temp,imax)

  17. return imax

 

 

 

 

买卖股票的最佳时机—2:

 

题目:

用一个数组表示股票每天的价格,数组的第i个数表示股票在第i天的价格。

交易次数不限,但一次只能交易一支股票,也就是说手上最多只能持有一支股票,求最大收益。

你可以完成尽可能多的交易(多次买卖股票)。

然而,你不能同时参与多个交易(你必须在再次购买前出售股票)。

解法:

贪心算法,买卖次数不限,问题就简单了,只要挣钱就卖出。

 

 

代码:时间O(n),空间O(1)

 

 
  1. def maxProfit_2(prices):

  2. max_profit = 0

  3. for i in range(1,len(prices)):

  4. d = prices[i] - prices[i-1]

  5. # 值为正即存在利益

  6. if d > 0 :

  7. max_profit += d

  8. return max_profit

 

 

 

买卖股票的最佳时机—3:

 

 

题目:

假设你有一个数组,其中第i 个元素是第i天给定股票的价格。

设计一个算法来找到最大的利润。您最多可以完成两笔交易。
您不可以同时进行多笔交易(即您必须在再次购买之前出售股票)。

解法:

其实也就是找到两个最大子数组和,和第一道题差不多。

 

先求出第一个最大子数组,避开第一个最大子数组的情况下,再求出第二大子数组,再相加即可。

 

 

代码1:时间O(n),空间O(1)

 
  1. def maxProfit_3_1(prices):

  2. release1 = -999

  3. release2 = -999

  4. hold1 = 0

  5. hold2 = 0

  6. for i in prices:

  7. release2 = max (release2, hold2 + i)

  8. hold2 = max (hold2, release1 - i)

  9. release1 = max (release1, hold1 + i)

  10. hold1 = max (hold1, -i)

  11. return release2

代码2:

 

 
  1. def maxProfit_3_2(prices):

  2. sell = [0]

  3. buy = [0]

  4. plen = len (prices)

  5. minp = prices[0]

  6. maxp = prices[-1]

  7.  
  8. for i in range (1, plen):

  9. minp, maxp = min (minp, prices[i]), max (maxp, prices[plen - i - 1])

  10. sell.append (max (sell[i - 1], prices[i] - minp))

  11. buy.append (max (buy[i - 1], maxp - prices[plen - i - 1]))

  12.  
  13. return max (sell[i] + buy[plen - i - 1] for i in range (plen))

 

 

 

买卖股票的最佳时机—4:

 

 

题目:

假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格。

设计一个算法来找到最大的利润。你最多可以完成 k 笔交易。
你不可以同时参与多笔交易(你必须在再次购买前出售掉之前的股票)

解法:

将这些关键变量命名为本地利润和全局利润,以使事情更容易理解

 

 

 

代码1:

 

 
  1. def maxProfit_4(k,prices):

  2. if not prices: return 0

  3. n = len (prices)

  4. if k >= n // 2:

  5. return sum (

  6. x - y

  7. for x, y in zip (prices[1:], prices[:-1])

  8. if x > y)

  9.  
  10. profits = [0] * n

  11. for j in range (k):

  12. max_all = max_prev = max_here = 0

  13. for i in range (1, n):

  14. profit = prices[i] - prices[i - 1]

  15. max_here = max (max_here + profit, max_prev + profit, max_prev)

  16. max_prev = profits[i]

  17. profits[i] = max_all = max (max_all, max_here)

  18. return profits[-1]

 

代码2:

 

 
  1. def maxProfit4(self, k, prices):

  2. n = len(prices)

  3. if n < 2:

  4. return 0

  5. if k >= n / 2:

  6. return sum(i - j

  7. for i, j in zip(prices[1:], prices[:-1]) if i - j > 0)

  8. globalMax = [[0] * n for _ in xrange(k + 1)]

  9. for i in xrange(1, k + 1):

  10. # 最大的利润与我的交易和卖出股票在第j天。

  11. localMax = [0] * n

  12. for j in xrange(1, n):

  13. profit = prices[j] - prices[j - 1]

  14. localMax[j] = max(

  15. # 我们以(i - 1)的交易获利最多在(j - 1)天

  16. # 在最后一次交易中,我们每天买进股票(j - 1),然后在第j日卖出。

  17. globalMax[i - 1][j - 1] + profit,

  18. # 在(j - 1)天内,我们以(i - 1)的转换期取得了最大的利润。

  19. # 最后一次交易,我们在j日买进股票,在同一天卖出,所以我们有0利润,显然我们不需要加它。

  20. globalMax[i - 1][j - 1], # + 0,

  21. # 我们已在(j - 1)天内赢利。

  22. # 我们想取消那天(j - 1)的销售,在j日卖出。

  23. localMax[j - 1] + profit)

  24. globalMax[i][j] = max(globalMax[i][j - 1], localMax[j])

  25. return globalMax[k][-1]

 

 

有不明白的情况以下链接。

如上案例参考:https://leetcode.com/problemset/all/?search=Best%20Time%20to%20Buy%20and%20Sell%20Stock

转载地址:http://agkii.baihongyu.com/

你可能感兴趣的文章
cocos摇杆、按键和角色动画制作
查看>>
cocos UI、地图和关卡文本制作(一)
查看>>
cocos UI、地图和关卡文本制作(二)
查看>>
COCOS敌人和AI制作
查看>>
bw项目抱佛脚入门资料-5.处理链和计划任务
查看>>
cocos角色和敌人行为互动脚本制作
查看>>
ABAP项目砖家之旅-alv项目实战
查看>>
ABAP项目砖家之旅-screen和表单项目实战
查看>>
ABAP项目砖家之旅-ABAP对象命名规则
查看>>
SAP接口集成-PO/PI-SLD配置
查看>>
SAP接口集成-abap调用外部数据库
查看>>
abap实现大数据-echar调用
查看>>
SAP财务凭证校验和替换
查看>>
java编程之伪静态(urlrewrite)
查看>>
SpringMVC+Mybatis 多数据源配置
查看>>
springboot/cloud使用redis存储对象
查看>>
JVM之常用启动参数(扩展参数)
查看>>
同步/异步 阻塞/非阻塞
查看>>
Java中高级进阶之路:Java基础篇——HashMap(ConcurrentHashMap)
查看>>
linx项目部署常用指令
查看>>