[LeetCode] Best Time to Buy and Sell Stock I II II

转载:来自梁佳宾的网络日志

求数组中差值最大的两个数,后面的那个数要大于前面的那个数

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
//I题意:用一个数组表示股票每天的价格,数组的第i个数表示股票在第i天的价格。 如果只允许进行一次交易,也就是说只允许买一支股票并卖掉,求最大的收益。
//分析:动态规划法。从前向后遍历数组,记录当前出现过的最低价格,作为买入价格,并计算以当天价格出售的收益,作为可能的最大收益,整个遍历过程中,出现过的最大收益就是所求。
int maxp(vector<int> ve)
{
    if (ve.size() < 2)
    {
        return 0;
    }
    int maxc = 0,i=0;
    int curmin = ve[0];
    for (i = 0; i < ve.size(); i++)
    {
        curmin = min(curmin, ve[i]);
        maxc = max(maxc, ve[i]-curmin);
    }
    return maxc;
}

//II题目:用一个数组表示股票每天的价格,数组的第i个数表示股票在第i天的价格。交易次数不限,但一次只能交易一支股票,也就是说手上最多只能持有一支股票,求最大收益。
//分析:贪心法。从前向后遍历数组,只要当天的价格高于前一天的价格,就算入收益。
int maxp2(vector<int> ve)
{
    if (ve.size() < 2)
    {
        return 0;
    }
    int maxc = 0, i = 0;
    int curmin = ve[0];
    for (i = 1; i < ve.size(); i++)
    {
        
        if (ve[i] - ve[i-1] > 0)
        {
            maxc += ve[i] - ve[i - 1];
            
        }
    }
    return maxc;
}
//III用一个数组表示股票每天的价格,数组的第i个数表示股票在第i天的价格。最多交易两次,手上最多只能持有一支股票,求最大收益。
//分析:动态规划法。以第i天为分界线,计算第i天之前进行一次交易的最大收益preProfit[i],和第i天之后进行一次交易的最大收益postProfit[i],最后遍历一遍,max{ preProfit[i] + postProfit[i] } (0≤i≤n - 1)就是最大收益。第i天之前和第i天之后进行一次的最大收益求法同Best Time to Buy and Sell Stock I。
int maxp3(vector<int> ve)
{
    if (ve.size() < 2)
        return 0;
    int n = ve.size();
    int *pre=new int[n]();
    int *post = new int[n]();
    
    int curmin = ve[0], curmax = ve[n-1];
    int i = 0,total=0;
    for (i = 1; i < ve.size(); i++)
    {
        curmin = min(curmin, ve[i]);
        pre[i]=(max(pre[i-1],ve[i]-curmin));
    }
    for (i = n - 2; i >= 0; i--)
    {
        curmax = max(curmax,ve[i]);
        post[i]=(max(post[i+1],curmax-ve[i]));
    }
    for (i = 0; i < ve.size(); i++)
    {
        total = max(total, pre[i] + post[i]);
    }
    return total;
}

int main()
{
    //vector<int> ve = { 7, 6, 8, 3, 4, -1, 9, -1, 10 };
    vector<int> ve = {-2,-3,-3,-6,-1,-7};
    int n = maxp3(ve);
    cout << maxp3(ve) << endl;
}


转载于:https://my.oschina.net/a20092173/blog/508436

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值