leetcode 122. 买卖股票的最佳时机 II
生活随笔
收集整理的這篇文章主要介紹了
leetcode 122. 买卖股票的最佳时机 II
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
難度:中等
頻次:35
題目:
給定一個數組 prices ,其中 prices[i] 表示股票第 i 天的價格。
在每一天,你可能會決定購買和/或出售股票。你在任何時候 最多 只能持有 一股 股票。你也可以購買它,然后在 同一天 出售。
返回 你能獲得的 最大 利潤 。
解題方法:動態規劃、暴力解法[兩遍循環]
- 動態規劃用于多階段決策問題;
- 動態規劃問題的問法:只問最優解,不問具體解;
- 掌握無后效性解決動態規劃問題:把約束條件設置成為狀態。
解題思路:
1.題目只問最大利潤,沒有問這幾天具體哪一天買,哪一天賣。 也就是只問 最優解,不問具體解。
2.找出約束條件【無后效性】:
- 條件①:你不能在買股票前賣出股票。
- 條件②:最多只允許完成一筆交易。
因此當天是否持股 是一個很重要的因素,而當前是否持股和昨天是否持股有關系,為此我們需要把是否持股涉及到狀態數組中。
狀態定義:
dp[i][j]:下表為i這一天結束時,持股狀態為j時,我們持有的現金數。
- j=0,表示當前不持股。
- j=1,表示當前持股。
推導狀態轉移方程:
dp[i][0]:規定今天不持股,有以下兩種情況:
- 昨天不持股,今天什么都不做;
- 昨天持股,今天賣出(現金增加);
dp[i][1]:規定今天持股,有以下兩種情況 - 昨天持股,今天什么都不做;
- 昨天不持股,今天買入(現金減少)
看交易幾次,交易1次,說明你買之前是沒錢的。交易多次,說明你之前是有錢的
public class Solution {class Solution {public int maxProfit(int[] prices) {int len=prices.length;if(len<2) return 0;int[][] dp=new int[len][2];dp[0][0]=0;dp[0][1]=-prices[0];for(int i=1;i<len;i++){dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);//允許多次交易,所以必須前一天是有錢的dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);}//返回 最后一天賣掉股票的結果return dp[len-1][0];} }總結
以上是生活随笔為你收集整理的leetcode 122. 买卖股票的最佳时机 II的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 518. 零钱兑换 I
- 下一篇: java学习与总结:集合类