122 买卖股票的最佳时机-02


动态规划
class Solution {
public int maxProfit(int[] prices) {
int dp_0 = 0;
int dp_1 = -prices[0];
for(int i=1;i<prices.length;i++){
int tmp_dp_0 = Math.max(dp_0,dp_1+prices[i]);
int tmp_dp_1 = Math.max(dp_1,dp_0-prices[i]);
dp_0 = tmp_dp_0;
dp_1 = tmp_dp_1;
}
return dp_0;
}
}

时间复杂度O(n)O(n)O(n),其中nnn是pricespricesprices数组的长度。
空间复杂度O(1)O(1)O(1)。
贪心
由于股票的购买没有限制,因此整个问题等价于寻找xxx个不想交的区间(li,ri](l_i,r_i](li,ri]使得下面的式子最大化∑i=1xa[ri]−a[li]\sum_{i=1}^{x}a[r_i]-a[l_i] i=1∑xa[ri]−a[li]
其中lil_ili表示在第lil_ili天买入,rir_iri表示在rir_iri卖出。
我们注意到对于 (li,ri](l_i,r_i](li,ri] 这一区间贡献的价值 a[ri]−a[li]a[r_i]-a[l_i]a[ri]−a[li] ,等价于(li,li+1],(li+1,li+2],...,(ri−1,ri](l_i,l_{i+1}],(l_{i+1},l_{i+2}],...,(r_{i-1},r_i](li,li+1],(li+1,li+2],...,(ri−1,ri] 这若干个区间长度为111的价值和。
贪心的角度考虑,我们每次选择贡献大于000的区间就能使答案最大化。
需要说明的是,贪心算法只能用于计算最大利润,计算过程并不是实际的交易过程。
class Solution {
public int maxProfit(int[] prices) {
int max_profit = 0;
for(int i=1;i<prices.length;i++){
if(prices[i]-prices[i-1]>0){
max_profit+=prices[i]-prices[i-1];
}
}
return max_profit;
}
}

时间复杂度O(n)O(n)O(n),其中nnn是pricespricesprices数组的长度。
空间复杂度O(1)O(1)O(1)。

本文探讨了两种解决股票交易最佳时机问题的方法:动态规划和贪心算法。动态规划法通过维护两个状态变量实现,而贪心策略则每次选择收益最大的交易。两种方法的时间复杂度均为O(n),空间复杂度为O(1)。
282

被折叠的 条评论
为什么被折叠?



