• 股票两次买卖最大收益(java)


    题目:一个人一天只能进行最多两次买和两次卖,并且只有卖了才能继续买。问一天可以获得的最大收益,要采用时间复杂度低的实现。

    输入:5 2,4,6,8,10.输出:8 (2买,10卖) 

    输入:6 10,22,5,75,65,80.输出:87  (10买,22卖,5买,80卖)

    动态规划解决方法:设置数组dp[i][j]表示:prices[i]买入到prices[j]卖出的收益。则得出dp[i][j]为

    0 12 -5  65  55 70  
    0  0 -17 53  43 58  
    0  0   0  70  60 75  
    0  0   0   0 -10  5  
    0  0   0   0   0  15  
    0  0   0   0   0   0 

    然后:先找出最大值的位置和买入卖出的时间,题中是75最大,买入i=2,卖出j=5

    然后根据买入卖出的时间,算出除此之外时间段的最大值

    代码如下:

    1. public static int maxProfit(int[] prices, int length) {
    2. int res = 0;
    3. int dp[][] = new int[length][length];
    4. for (int i = 0; i < length - 1; i++) {
    5. for (int j = i + 1; j < length; j++) {
    6. dp[i][j] = prices[j] - prices[i];
    7. System.out.print(dp[i][j] + " ");
    8. }
    9. }
    10. int max = 0;
    11. int ma2 = 0;
    12. int start = 0;
    13. int end = 0;
    14. for (int i = 0; i < length; i++)
    15. for (int j = i + 1; j < length; j++) {
    16. if (dp[i][j] > max) {
    17. max = dp[i][j];
    18. start = i;
    19. end = j;
    20. }
    21. }
    22. System.out.println(start + " " + end + " " + max);
    23. for (int i = 0; i < start; i++)
    24. for (int j = i + 1; j < start; j++) {
    25. if (dp[i][j] > ma2) {
    26. ma2 = dp[i][j];
    27. }
    28. }
    29. if (end < length - 1)
    30. for (int i = end + 1; i < length; i++) {
    31. for (int j = i + 1; j < length; j++) {
    32. if (dp[i][j] > ma2) {
    33. ma2 = dp[i][j];
    34. }
    35. }
    36. }
    37. res = max + ma2;
    38. return res;
    39. }

  • 相关阅读:
    js location.href ,location.replace, location.reload
    //js date对象常用方法
    js Math对象常用方法
    n sum
    two sum
    树:树中两个节点的最低公共祖先
    C++11:智能指针与lambda表达式
    回溯: 0-1背包
    动态库的soname实验
    DNS介绍与安装使用
  • 原文地址:https://www.cnblogs.com/hirampeng/p/9700646.html
Copyright © 2020-2023  润新知