LeetCode0122.买卖股票的最佳时机II买卖股票的最佳时机II【Easy】【Python】【贪心】【动态youet规划LeetC】问题第i个元素是给定股票在第i天的价格的数组。设计一个算法来找到最大利润。您可以完成任意多笔交易(即,多次买入和卖出一股股票)。注意:您不能同时进行多笔交易(即,您必须在再次买入之前卖出股票).示例1:输入:[7,1,5,3,6,4]输出:7解释:第2天买入(价格=1),第3天卖出(价格=5),利润=5-1=4.然后在第4天买入(价格=3)并在第5天卖出(价格=6),利润=6-3=3。示例2:输入:[1,2,3,4,5]输出:4解释:第1天买入(价格=1),第5天卖出(价格=5),利润=5-1=4。请注意,您不能在第1天买入,第2天买入,然后再卖出,因为您同时进行多项交易。你必须在再次购买之前卖出。示例3:输入:[7,6,4,3,1]输出:0解释:在这种情况下,没有交易完成,即最大利润=0。问题给定一个数组,其第i个元素是给定股票在第i天的价格,设计一个算法来计算你可以获得的最大利润。您可以完成尽可能多的交易(多次买卖股票)。注意:您不能同时参与多笔交易(必须先卖出之前的股票再买入)。示例1:输入:[7,1,5,3,6,4]输出:7解释:第2天买入(股价=1),第3天买入(股价=5)卖出,本次交易可以使一笔利润=5-1=4。那么,第4天买入(股价=3),第5天卖出(股价=6),本次交易可获利=6-3=3。例2:输入:[1,2,3,4,5]输出:4解释:第1天买入(股价=1),第5天卖出(股价=5),本次交易可获利=5-1=4.请注意,您不能在第1天和第2天连续买入股票,然后再卖出。因为这是同时涉及多笔交易,所以必须先卖掉之前的股票再买。例3:输入:[7,6,4,3,1]输出:0解释:本例中没有交易完成,所以最大利润为0。解题思路一贪心根据题意,它就是按照每天的顺序买卖股票。因此,只要第二天的价格大于前一天的价格,就可以买卖股票。时间复杂度:O(len(prices))空间复杂度:O(1)Python3codeclass解决方案:defmaxProfit(self,prices:List[int])->int:#解决方案一:Greedyifnotpricesorlen(prices)==0:return0profit=0foriinrange(len(prices)-1):if(prices[i+1]>prices[i]):profit+=prices[i+1]-prices[i]返回利润解二次动态规划求状态方程dp[i][k][0]=max(dp[i-1][k][0],dp[i-1][k][1]+prices[i])解释:昨天没有股票,但是昨天有股票卖出dp[i][k][1]=max(dp[i-1][k][1],dp[i-1][k][0]-prices[i])解释:昨天有库存,昨天没有库存。今天购买基本案例:dp[-1][k][0]=dp[i][k][0]=0dp[-1][k][1]=dp[i][k][1]=-infk=+inf因为k是正无穷大,那么k和k-1可以看成是一样的。buy+sell=一次完整的交易,这里把sell看成一次交易,所以第一行是k-1。dp[i][k][0]=max(dp[i-1][k][0],dp[i-1][k-1][1]+价格[i])=max(dp[i-1][k][0],dp[i-1][k][1]+价格[i])dp[i][k][1]=max(dp[i-1][k][1],dp[i-1][k][0]-prices[i])因此k对状态转换没有影响:dp[i][0]=max(dp[i-1][0],dp[i-1][1]+价格[i])dp[i][1]=max(dp[i-1][1],dp[i-1][0]-价格[i])i=0,dp[i-1]无效。dp[0][0]=max(dp[-1][0],dp[-1][1]+prices[i])=max(0,-infinity+prices[i])=0dp[0][1]=max(dp[-1][1],dp[-1][0]-prices[i])=max(-infinity,0-prices[i])=-prices[i]空间复杂度:O(1)Python3代码类解决方案:defmaxProfit(self,prices:List[int])->int:#解决方案二:动态规划dp_i_0=0dp_i_1=float('-inf')#i的负无穷大inrange(len(prices)):temp=dp_i_0#昨天没有存货,昨天有存货,今天卖出dp_i_0=max(dp_i_0,dp_i_1+prices[i])#dp_i_0和dp_i_1可以看作变量,stored是上次的值,也就是昨天#昨天有股票,昨天没有股票。今天买dp_i_1=max(dp_i_1,temp-prices[i])returndp_i_0codeaddressGitHublinkreferenceamethodkill6stockproblems
