[LeetCode] Best Time to Buy and Sell Stock 买卖股票的最佳时间

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

If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.
买卖股票的最佳时间
与此题一样

最大差值 - CSDN博客
https://blog.csdn.net/coolwriter/article/details/79975775

有一个长为n的数组A,求满足0a≤b<n的A[b]-A[a]的最大值。
给定数组A及它的大小n,请返回最大差值。
测试样例:
[10,5],2
返回:0

1.一次交易卖买

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int res = 0, buy = INT_MAX;
        for (int price : prices) {
            buy = min(buy, price);
            res = max(res, price - buy);
        }
        return res;
    }
};

2. 无限次交易买卖,必须是一次交易结束了,再进行下一次交易,

这道题由于可以无限次买入和卖出。我们都知道炒股想挣钱当然是低价买入高价抛出,那么这里我们只需要从第二天开始,如果当前价格比之前价格高,则把差值加入利润中,因为我们可以昨天买入,今日卖出,若明日价更高的话,还可以今日买入,明日再抛出

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int res = 0, n = prices.size();
        for (int i = 0; i < n - 1; ++i) {
         //res+= prices[i] - prices[i-1] >0 ? prices[i] - prices[i-1] :0 ;  
            if (prices[i] < prices[i + 1]) 
            {
                res += prices[i + 1] - prices[i];
            }
        }
        return res;
    }
};

3.最多允许两次交易,但必须是一次交易结束了,再进行下一次交易

给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<=100,0<=prices[i]<=100

思路:

题目要求计算两次交易机会所获收益最大值,则可以先正序遍历一遍记录第k天时第一次交易可以获得的最大收益,然后再后序遍历一次,记录第k天时后面有第二次交易可获的最大收益。再将第k天的两次交易最大值相加比较即可获得结果。注意,正序遍历时表示在第k天之前可以获得的最大收益,后序遍历表示第k天后面可以获得的最大收益。

class Solution {  
public:  
    /** 
     * 计算你能获得的最大收益 
     *  
     * @param prices Prices[i]即第i天的股价 
     * @return 整型 
     */  
    int calculateMax(vector<int> prices) {  
        int len = prices.size();  
        vector<int> leftmax(n);  
        vector<int> rightmax(n);  

        //正序遍历  
        int primin = prices[0];  
        leftmax[0] = 0;  
        for(int i=1;i<len;++i){  
            primin = min(primin, prices[i]);  
            leftmax[i] = max(leftmax[i-1], prices[i] - primin);  
        }  

        //后序遍历  
        int primax = prices[len-1];  
        rightmax[len-1] = 0;  
        for(int i=len-2;i>=0;--i){  
            primax = max(primax, prices[i]);  
            rightmax[i] = max(rightmax[i+1], primax - prices[i]);  
        }  

        int pmax = 0;  
        for(int i=0;i<len;++i)  
            pmax = max(pmax, leftmax[i] + rightmax[i]);  
        return pmax;  

    }  
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值