• [LeetCode] Best Time to Buy and Sell Stock III


    Say you have an array for which the ith element is the price of a given stock on day i.

    Design an algorithm to find the maximum profit. You may complete at most two transactions.

    Note: You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

    方法:参考LeetCode discuss中探讨。

    • Get the max profit with one transaction to the full array. Keep down the start and end positions.
    • the start and end positions will be included in the result of two transaction. It falls into two categories: A) it is one full transaction, B) they belong to two separate transactions(start belongs to first transaction and end belongs to second transaction).

    • if A)-- get max profit with one transaction to subarray from 0 to start ; get max profit with one transaction to subarray from end to prices.length.

    • if B)-- get the max profit with one transaction within ****start and end** in **reverse order****

    • return the max profit in those cases

    代码如下,是自己写的:

    class Solution {
    public:
        int len;
        int minIndex,maxIndex;
        int maxProfit(vector<int> &prices) {
            len = prices.size();
            if(len<2)
                return 0;
            
            set<int> max_profit;
            find_minAndMaxIndex(0,len-1,prices);
            int min = minIndex;
            int max = maxIndex;
            //max_profit = prices[maxIndex] - prices[minIndex];
            //case A
            find_minAndMaxIndex(0,min-1,prices);
            max_profit.insert(prices[maxIndex] - prices[minIndex]+prices[max] - prices[min]);
            find_minAndMaxIndex(max+1,len-1,prices);
            max_profit.insert(prices[maxIndex] - prices[minIndex]+prices[max] - prices[min]);
            //case B
            
            vector<int> ReversePrices;
            for(int j=max-1;j>min;j--){
                ReversePrices.push_back(prices[j]);
            }
            find_minAndMaxIndex(0, ReversePrices.size()-1,ReversePrices);
            if(ReversePrices.empty())
                max_profit.insert(prices[max] - prices[min]);
            else
                max_profit.insert(ReversePrices[maxIndex] - prices[min]+prices[max] - ReversePrices[minIndex]);
            set<int>::iterator iter = max_profit.end();
            iter--;
            return *iter;
        }
    private:
        void find_minAndMaxIndex(int startIndex,int endIndex,vector<int> &prices){
            minIndex=startIndex;
            maxIndex=startIndex;
            int minIndexNew = minIndex;
            int maxProfit = 0;
            if(startIndex<0||startIndex>=len|| endIndex>=len|| endIndex<0 || startIndex>=endIndex)
                return ;
            int min_price = prices[startIndex];
            int max_price = prices[startIndex];
            
            for(int i=startIndex+1;i<=endIndex;i++){//找到最小价格和最大价格的下标
                if(prices[i]<min_price){
                 minIndexNew = i;
                 min_price = prices[i];
                } else if(maxProfit < prices[i]-min_price){
                 minIndex = minIndexNew;
                 maxIndex = i;
                 maxProfit = prices[i]-min_price;
                }
            }//end for        
        }
    };
  • 相关阅读:
    C# 获取当前文件所在文件夹路径、文件路径、操作环境变量
    C#监控文件发生变化
    深夜有感
    Python学习笔记:sort和sorted实现排序之对比
    Python学习笔记:给定邮编,判断区域
    Python学习笔记:格式化输出之fstring、format、%
    机器学习笔记:偏度skew与峰度kurt
    Python学习笔记:快递运费计算
    PHP时间处理总结 何苦
    http status 状态码 何苦
  • 原文地址:https://www.cnblogs.com/Xylophone/p/3887647.html
Copyright © 2020-2023  润新知