leetcode122 买卖股票的最佳时机 II

给定一个数组 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 。
示例 2:
输入: prices = [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例 3:
输入: prices = [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

提示:
1 <= prices.length <= 3 * 104
0 <= prices[i] <= 104

思路:
采用贪心算法,如果要使利润最大,则每个正区间都必须利用到,如果是相邻两个数间的正区间则很简单,只需要第一天买入第二天卖出,如果是好几个相邻的正区间,则在这些正区间的开头买入,结尾卖出,这样就能将这些连续的正区间串成一个大区间,使得其中每个区间都不被浪费。(这么简单的事最开始居然没想到,还思考了半天不明所以的东西。。。)因此,最大利润就是将其中每个正区间加起来求和的结果。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
int n=prices.size();
int price=0;
for(int i=0;i<n-1;i++)
{
    if(prices[i+1]-prices[i]>0)
    {
        price+=prices[i+1]-prices[i];
    }
}
return price;
    }
};
### LeetCode 122 买卖股票最佳时机 II 的解决方案和思路 #### 动态规划方法解析 对于此问题,动态规划提供了一种有效的方法来解决。通过定义两个状态变量——持有股票的状态 `hold` 和未持有股票的状态 `not_hold` ,可以在遍历价格列表的过程中不断更新这两个状态所对应的最优解。 当处于持有状态时,意味着要么之前已经持有了这支股票并继续保留它;要么是在当前日买入了新的股票。而如果处在未持有的状态下,则表示可能前一天就没有持股或者是今天刚刚把手中的股票给卖出去了[^2]。 因此,在每一天结束之际: - 如果选择保持持有,则最大收益等于昨天持有加上今天的股价变化(如果是正向增长),或者说是昨日不持有但今日购入的成本; - 若决定不再持有,那么就取两者之间的较大者作为这一天结束后最好的情况:即延续之前的无股状况不变或是卖掉现有股份所带来的额外收入。 具体实现方面,可以通过一次循环完成所有操作,并且仅需常量空间存储必要的中间结果。 ```python def maxProfit(prices): not_hold, hold = 0, float('-inf') for price in prices: not_hold, hold = max(not_hold, hold + price), max(hold, not_hold - price) return not_hold ``` 这段代码实现了上述逻辑,其中 `float('-inf')` 表示负无穷大,用来初始化不可能的情况下的最小值。最终返回的是 `not_hold` 变量中的数值,因为到最后一天为止,手中不应该还留有任何尚未售出的股票才能达到最高利润[^5]。 #### 贪心算法的应用 另一种更直观也更容易理解的方式是采用贪心策略解决问题。这里的核心思想在于每当遇到价格上涨的机会就要抓住机会赚取差价。换句话说,只要发现明天的价格高于今天就可以考虑在这两天之间进行交易以获取这部分增值部分的价值。 这种方法背后的原理其实很简单:假设存在一段连续上涨的趋势 `[a,b,c,d,e]` (其中 a<b<c<d<e),那么无论是一次性从最低点买到最高点还是分多次逐步累积这些增量都能得到相同的总收益 `(e-a)` 。而对于非单调递增的情形来说,局部的小幅波动同样适用这一原则,只需关注那些确实能够带来正面回报的变化即可[^4]。 以下是基于这种想法编写的 Python 函数版本: ```python def maxProfit_greedy(prices): profit = 0 for i in range(len(prices) - 1): diff = prices[i + 1] - prices[i] if diff > 0: profit += diff return profit ``` 以上两种方式都可以很好地处理这个问题,并且时间复杂度均为 O(n),n 是数组长度。实际应用中可以根据个人喜好或特定场景的需求选取合适的一种来进行编码实践。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值