leetcode每日一题——122.买卖股票的最佳时机II(面试经典150题)

一、题目描述与要求

122. 买卖股票的最佳时机 II - 力扣(LeetCode)

题目描述

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 

示例

示例1:

输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。
     总利润为 4 + 3 = 7 。

示例2:

输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
     总利润为 4 。

示例3:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0 。

提示

  • 1 <= prices.length <= 3 * 104
  • 0 <= prices[i] <= 104

二、解题思路

总的思路:

        先分析题目可知,题目要求我们根据价格数组,找到最合适的买入时间与卖出时间,从而使得利润最大。因而可以利用贪心算法来实现。也就是我们要找出最小的买入价格与对应所能达到的最高利润。

       首先,我们可以先思考什么时候我们必须要卖出去呢?那就是当你发现第二天价格要降低的时候马上卖出去,又或者是已经是最后一天了,就必须要卖出去。因而我们可以设置卖出条件为price[i]>price[i+1](i<pricesSize)或者i==pricesSize-1。只要触发这个条件我们就卖出。这时候我们就要判断是否达到了最大利润,用此时的价格减去买入的价格,也就是minPrice,如果是负数那就不需要更新maxPrice,因为这一操作没法得到正利润,所以不更新就相当于不参与交易。如果结果是正的,则更新maxPrice最大利润。然后再更新对应的minPrice,将其设置为当天卖出的价格,接着对数组剩下的部分进行判断是否进行交易。【这里就体现除了贪心算法中局部最优解。贪心算法是获得局部最优解然后再合并成整体的解(对于整体来说不一定是最优的)】

       然后对于买入时间,那就是先将第一天的价格设置为最小价格,然后在遍历数组的过程中如果发现比当前最小价格更小的价格,并且未卖出,则对其进行更新。最后返回最大利润即可。

具体步骤:

①定义初始最大利润与初始最低价

②遍历数组,判断是否将股票卖出,如果需要卖出,更新对应的maxPrice以及minPrice

③判断minPrice是否需要更新

④返回maxPrice


三、具体代码【C语言】

int maxProfit(int* prices, int pricesSize){
    //贪心算法
    int maxProfit = 0;//最大利润
    int minPrice  =prices[0];//最低价——用来买入股票
    int i;
    for(i=1; i< pricesSize; i++)
    {
        //发现后一天的价格更便宜或者已经是最后一天了 这时候就必须要卖出
        if(((i < pricesSize-1) && (prices[i] > prices[i+1])) || (i==pricesSize-1))
        {
            if(prices[i]- minPrice > 0)//不是负盈利才能计算最大利润
                maxProfit += prices[i]- minPrice;
            //更新最低价
            minPrice = prices[i];//卖出股票后更新最低价为当天售价
        }
        //如果找到了更低价的价格,则更新最低价(买入价格) 因而可以实现在最低价买入
        if(minPrice > prices[i])
            minPrice = prices[i];    
    }
    return maxProfit;
}

猜你喜欢

转载自blog.csdn.net/m0_59800431/article/details/131584735