赞
踩
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
- 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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。