当前位置:   article > 正文

股票交易类算法_股票交易算法

股票交易算法

问题1:简单买卖:只允许买卖一次Best Time to Buy and Sell Stock

本题意思就是你得到一系列在接下来几天的股票价格,现在你被允许只用一次交易(就是买进再卖出)来获取最大利益。 

 求一组数中最大差问题(只能是后面的数减前面的数)

转化一下思路,求出两两相邻数的差,求一系列差值的最大连续子序列和,问题就转化为 

Maximum Subarray问题

注意两点:

收益不能为负,所以如果求出来的值小于0,输出0

如果给出的数组只有一个数,也输出0

  1. public int maxProfit(int[] prices) {
  2. int length = prices.length;
  3. if(length < 2)return 0;
  4. int sum = 0,max = Integer.MIN_VALUE;
  5. for(int i =1;i<length;i++){
  6. int diff = prices[i]-prices[i-1];
  7. sum += diff;
  8. if(max < sum)max=sum;
  9. if(sum < 0)sum = 0;
  10. }
  11. if(max < 0)return 0;
  12. return max;
  13. }

问题2:简单买卖:可以买卖无穷多次

意思是买卖股票时可以不计买卖次数,但是必须在买之前先把以前的股票卖掉。然后求能获利最大的额度。 这样的话也很简单,只要遇见下一天的价格比这一天价格高的话,就卖出。

求所有上升期差价的总和。

  1. public int maxProfit(int[] prices) {
  2. int length = prices.length;
  3. int ret = 0;
  4. for(int i = 0;i<length-1;i++){
  5. if(prices[i]<prices[i+1]){
  6. ret += (prices[i+1]-prices[i]);
  7. }
  8. }
  9. return ret;
  10. }

问题3:挑选股票

挑选规则:给定一个股票集合vector<int> stocks,股票编号为1,2,3...,N。挑选规则:

1. 从左往右,第一个开始,每隔一个就删除一个;比如第一次删除的是1,3,5...

2. 从右往左,最后一个开始,每隔一个就删除一个。

重复1,2步骤,直至列表中只剩一只股票。

输入:股票个数N。

输出:最后剩下的那只股票编号。

示例:输入20,输出6。

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. int pickStock(vector<bool>& stocks, bool left, int* leftStart, int* rightStart);
  5. int main()
  6. {
  7. int input;
  8. cin >> input;
  9. vector<bool> stocks(input, true);
  10. if (input <= 1) {
  11. cout << "1" << endl;
  12. return 0;
  13. }
  14. int leftStart = 0;
  15. int rightStart = input - 1;
  16. for (int i = 0; i < input/2; ++i) {
  17. int leftSize = pickStock(stocks, true, &leftStart, &rightStart);
  18. if (leftSize == 1) {
  19. cout << leftStart+1 << endl;
  20. break;
  21. }
  22. leftSize = pickStock(stocks, false, &leftStart, &rightStart);
  23. if (leftSize == 1) {
  24. cout << leftStart+1 << endl;
  25. break;
  26. }
  27. }
  28. return 0;
  29. }
  30. /**
  31. * 挑选函数
  32. * 第二个参数标识从左往右,还是从右往左
  33. * 第三个参数是从左往右第一个没有被删除的位置
  34. * 第四个参数是从右往左第一个没有被删除的位置
  35. *
  36. * 返回值:剩余股票数目
  37. * */
  38. int pickStock(vector<bool>& stocks, bool left, int* leftStart, int* rightStart) {
  39. if (*leftStart == *rightStart) {
  40. return 1;
  41. }
  42. int size = stocks.size();
  43. int existSize = 0;
  44. if (left) {//从左往右
  45. for (int i = *leftStart; i < size; ++i) {
  46. if (stocks[i]) {
  47. existSize++;
  48. if (existSize%2 == 1) {
  49. stocks[i] = false;
  50. }
  51. }
  52. }
  53. } else {//从右往左
  54. for (int i = *rightStart; i >= 0; --i) {
  55. if (stocks[i]) {
  56. existSize++;
  57. if (existSize%2 == 1) {
  58. stocks[i] = false;
  59. }
  60. }
  61. }
  62. }
  63. int leftSize = 0;
  64. bool hasLeftStart = false;
  65. for (int i = 0; i < size; ++i) {
  66. if (stocks[i]) {
  67. leftSize++;
  68. *rightStart = i;
  69. if (!hasLeftStart) {
  70. *leftStart = i;
  71. hasLeftStart = true;
  72. }
  73. }
  74. }
  75. return leftSize;
  76. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/628942
推荐阅读
相关标签
  

闽ICP备14008679号