算法Day8-购买和销售股票的最佳时机(一、二)

题目一

购买和销售股票的最佳时机(一)
假设有一个数组,其对i个元素是一支给定的股票在某一天i的价格。
如果最多只允许你完成一次交易(例如,购买或销售一次该股票的份额),设计一个算法,来找到最大的赢利点。

解析一

题目设定了只能交易一次,所以只要找到数组中任意两元素间最大的一个差值就可以了。用两个变量来记录当前最低价minV和当前最大利润maxP。
对于每一个数组元素,计算其与最低价minV的差值,如果该差价小于maxP,那么该元素不可能为所求元素,直接跳过,如果该差价大于maxP,则该元素产生了更大利润,用该差价替换maxP。

代码一

int maxProfit(vector<int> &prices){
    int minV = INT_MAX;//最低价
    int maxP = 0;//最大利润
    int diff = 0;//当前价格与最低价的差价
    int buyDate,sellDate;
    for(int i=0; i<prices.size(); i++)
    {
        if(prices[i] < minV){
            minV = pricrs[i];
            buyDate = i;
        }
        diff = prices[i] - minV;
        if(maxP < diff){
            maxP = diff;
            sellDate = i;
        }
    }
    cout<<"买入日: "<<buyDate<<" 卖出日:"<<sellDate<<endl;
    return maxP;//返回最大差价
}

题目二

购买和销售股票的最佳时机(二)

如果你可以进行任意次数的交易(例如,多次购买和销售该股票的份额)。
然而,你不能同时进行多次交易(例如,在再次购买之前,必须先销售该股票)。设计一个算法,来找到最大的赢利点。

解析二

因为可以交易无限次数,所以最大交易利润,就是所有交易利润的总和。从左到右扫描数组,只要是交易利润(差价>0),都加起来,即为所求。

代码二

int maxProfit(vector<int> &prices){
    int max = 0;
    int sum = 0;
    for(int i=1; i<prices.size(); i++)
    {
        int diff = prices[i] - prices[i-1];
        if(diff > 0){
            sum += diff;
            cout<<"买入日: "<<i-1<<endl;
            cout<<"卖出日: "<<i<<endl;
        }
    }
    return sum;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值