zoukankan      html  css  js  c++  java
  • 122. 买卖股票的最佳时机 II

    题意描述:

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

    设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

    注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

    示例1:

    输入: [7,1,5,3,6,4]
    输出: 7
    解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
    随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

    示例2:

    输入: [1,2,3,4,5]
    输出: 4
    解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
    注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
    因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

    示例3:

    输入: [7,6,4,3,1]
    输出: 0
    解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

    算法:

    题意十分清晰,没有绕弯子,看伪代码。

    伪代码

      参数:

        p - 当前位置

        sum - 返回值,初值为0

      遍历数组:

        if 数组[p] > 数组[p+1]:

          p 往后移动

        else:

          记录数组[p]的值

          从p处开始遍历数组,直到找到一个位置pos满足,数组[pos] > 数组[pos+1]

          sum += 数组[pos] - 数组[p]

          更新p值为pos所在的下一个位置

    代码:

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 
     5 class Solution {
     6 public:
     7     int maxProfit(vector<int>& prices) {
     8         int buy, sale, sum = 0;
     9         int pos;
    10         for(int p = 0; p+1 < prices.size();)
    11         {
    12             if(prices[p] > prices[p+1])
    13                 p++;
    14             else {
    15                 buy = prices[p];
    16                 for(pos = p; prices[pos] <= prices[pos+1] && pos+1 < prices.size(); pos++);
    17                 sale = prices[pos];
    18                 sum += sale - buy;
    19                 p = pos + 1;
    20             }
    21         }
    22         return sum;
    23     }
    24 };
    25 
    26 int main()
    27 {
    28     int a[] = {1,2,3,4,5};
    29     vector<int> vec(a, a+sizeof(a)/sizeof(int));
    30     Solution s;
    31     cout << s.maxProfit(vec);
    32     return 0;
    33 }
  • 相关阅读:
    模拟赛总结
    2018.04.06学习总结
    2018.04.06学习总结
    Java实现 LeetCode 672 灯泡开关 Ⅱ(数学思路问题)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 670 最大交换(暴力)
    Java实现 LeetCode 670 最大交换(暴力)
    Java实现 LeetCode 670 最大交换(暴力)
  • 原文地址:https://www.cnblogs.com/shayue/p/10228865.html
Copyright © 2011-2022 走看看