经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
算法计算出股票最佳交易时间点
来源:cnblogs  作者:Wu_Candy  时间:2021/5/24 10:49:59  对本文有异议

第一题


题目描述: 
????给定一段时间内每天的股票价格,已知你只可以买卖各一次,求最大的收益。

 

输入输出样例: 
????输入一个一维整数数组,表示每天的股票价格;输出一个整数,表示最大的收益。

Input:[7,1,5,3,6,4]
Output:5
????在这个样例中,最大的利润为在第二天价格为 1 时买入,在第五天价格为 6 时卖出。

 

题解: 
????我们可以遍历一遍数组,在每一个位置 i 时,记录 i 位置之前所有价格中的最低价格,然后 将当前的价格作为售出价格,查看当前收益是不是最大收益即可。

  1. int maxProfit(vector<int>& prices) {
  2. int sell = 0, buy = INT_MIN;
  3. for (int i = 0; i < prices.size(); ++i) {
  4. buy = max(buy, -prices[i]);
  5. sell = max(sell, buy + prices[i]);
  6. }
  7. return sell;
  8. }

 

第二题


题目描述: 
????给定一段时间内每天的股票价格,已知你只可以买卖各 k 次,且每次只能拥有一支股票,求 最大的收益。

 

输入输出样例: 
????输入一个一维整数数组,表示每天的股票价格;以及一个整数,表示可以买卖的次数 k。输 出一个整数,表示最大的收益。

Input: [3,2,6,5,0,3], k = 2
Output:7
????在这个样例中,最大的利润为在第二天价格为 2 时买入,在第三天价格为 6 时卖出;再在第 五天价格为 0 时买入,在第六天价格为 3 时卖出。

 

题解: 
????如果 k 大约总天数,那么我们一旦发现可以赚钱就进行买卖。如果 k 小于总天数,我们可以 建立两个动态规划数组 buy 和 sell,对于每天的股票价格,buy[j] 表示在第 j 次买入时的最大收 益,sell[j] 表示在第 j 次卖出时的最大收益。

 

  1. // 主函数
  2. int maxProfit(int k, vector<int>& prices) {
  3. int days = prices.size();
  4. if (days < 2) {
  5. return 0;
  6. }
  7. if (k >= days) {
  8. return maxProfitUnlimited(prices);
  9. }
  10. vector<int> buy(k + 1, INT_MIN), sell(k + 1, 0);
  11. for (int i = 0; i < days; ++i) {
  12. for (int j = 1; j <= k; ++j) {
  13. buy[j] = max(buy[j], sell[j-1] - prices[i]);
  14. sell[j] = max(sell[j], buy[j] + prices[i]);
  15. } }
  16. return sell[k];
  17. }
  18. // 辅函数
  19. int maxProfitUnlimited(vector<int> prices) {
  20. int maxProfit = 0;
  21. for (int i = 1; i < prices.size(); ++i) {
  22. if (prices[i] > prices[i-1]) {
  23. maxProfit += prices[i] - prices[i-1];
  24. } }
  25. return maxProfit;
  26. }

 

Swift 编程语言版本

  1. func maxProfit(_ prices: [Int]) -> Int {
  2. calculateProfit(prices, 0)
  3. }
  4. func calculateProfit(_ prices: [Int], _ index: Int) -> Int {
  5. if index >= prices.count {return 0}
  6. var max = 0
  7. for i in 0..<prices.count {
  8. var maxProfit = 0
  9. for j in i+1..<prices.count {
  10. if prices[i] < prices[j] {
  11. let curProfit = prices[j] - prices[i] + calculateProfit(prices, i + 1)
  12. if curProfit > maxProfit {
  13. maxProfit = curProfit
  14. }
  15. }
  16. }
  17. if maxProfit > max {
  18. max = maxProfit
  19. }
  20. }
  21. return max
  22. }

 

欢迎关注【无量测试之道】公众号,回复【领取资源】
Python编程学习资源干货、
Python+Appium框架APP的UI自动化、
Python+Selenium框架Web的UI自动化、
Python+Unittest框架API自动化、

资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。

备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

 

 添加关注,让我们一起共同成长!

原文链接:http://www.cnblogs.com/Wu13241454771/p/14793615.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号