欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

day6

程序员文章站 2022-07-13 22:30:05
...

day6

  1. c++
    作者:iswJXkYVv3
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size() == 0) return 0;
        int st = prices[0];
        vector<int> ans;
        ans.push_back(0);
        // 正向贪心,结果存储在 ans 中,注意此时范围是 1 ~ (size() - 2),计算的是 prices[now] - buy,st 是当前最优买入价
        for(int i = 1; i < prices.size() - 1; i ++)
        {
            ans.push_back(max(prices[i] - st, ans[i - 1]));
            st = min(prices[i], st);
        }
        st = prices[prices.size() - 1];
        int outp = ans[prices.size() - 1];
        // 反向贪心,结果存储在 ans 中,注意此时范围是 (size() - 2) ~ 1,计算的是 sell - prices[now],st 是当前最优卖出价 
        for(int i = prices.size() - 2; i > 0; i --)
        {
            outp = max(outp, st - prices[i] + ans[i]);
            st = max(prices[i], st);
        }
        return outp;
    }
};


  1. python
    作者:fei-ben-de-cai-zhu-UC4q0zhusJ
class Solution(object):
    # 本题可采用二分法计算
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        candidate = []
        # 记录出售股票所获得的最大收益
        max_profit = 0
        if len(prices) <= 1:
            return max_profit
        for index in range(len(prices)):
            left = self.single_profit(prices[:index])
            right = self.single_profit(prices[index:])
            max_profit = max(max_profit, left+right)
        return max_profit
            

    # 获取一段区间内完成一笔交易的最大利润
    def single_profit(self, prices):
        # 定义获取的最大利润
        max_profit = 0
        if len(prices) <= 1:
            return max_profit

        # 分别定义股票的最小价格以及最高价格
        min_price = prices[0]
        max_price = 0
        for price in prices:
            max_price = max(max_price, price-min_price)
            min_price = min(min_price, price)
        return max_price


if __name__ == "__main__":
    prices = [3,3,5,0,0,3,1,4]
    max_profit = Solution().maxProfit(prices)
    print(max_profit)


简单二分法
既然限制次数是两次,那我就可以使用二分法将prices区间分为两段,分别求左右两段区间内一次股票交易获得的最大利润即可。有些读者可能会疑惑:题目限制次数为两次,那么也可能是一次,即只需要一次股票交易就能获得最大利润
只需要一次遍历,不停的划分左右区间就可以求解每次遍历得到的最大值,最后取所有值的最大值即可。

作者:fei-ben-de-cai-zhu-UC4q0zhusJ

相关标签: 学习 笔记