买卖股票的最佳时机 II
贪心算法
根据题意,给出每天股票的价格,利用贪心算法思想,可以将当天和前一天的价格差,然后取大于零的差的和,就是所能获取的最大利润。可以使用折线图帮助理解,每一点代表每一天都卖出前一天的,然后买入当天的,然后只取上升的部分即可。
c++解法
class Solution {
public:
int maxProfit(vector<int>& prices) {
int res=0;
for(int i=0;i<prices.size()-1;i++)
res+=max(0,prices[i+1]-prices[i]);
return res;
}
};
java解法
class Solution {
public int maxProfit(int[] prices) {
int res=0;
for(int i=0;i<prices.length-1;i++)
res+=Math.max(0,prices[i+1]-prices[i]);
return res;
}
}
python解法
class Solution:
def maxProfit(self, prices: List[int]) -> int:
res=0
for i in range(len(prices)-1):
res+=max(0,prices[i+1]-prices[i])
return res
动态规划解法
动态规划法要根据前面的状态逐步推算出后面每一步的状态,从而得到最后的结果。本题使用动态规划解法首先要分析每天股票的状态,有两种:买入和卖出。创建dp[i][j]数组,i表示每一天,j表示每天买入卖出的状态,买入用1表示,卖出用0表示,然后写出状态转移方程,填充dp数组。注意:卖出会得到利润,买入会损失利润。
今天状态为卖出的最大利润=max(前一天没卖的最大利润+今天卖出的价格,前一天就卖了的最大利润)
dp[i][0]=max(d[i-1][1]+prices[i],d[i-1][0])
今天状态为买入的最大利润=max(前一天没买的最大利润-今天买入的价格,前一天就买入了的最大利润)
dp[i][1]=max(dp[i-1][0]-prices[i],dp[i-1][1])
c++解法
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len=prices.size();
int dp[len][2];
//设置初始值状态
dp[0][0]=0;//第一天卖出为利润为0
dp[0][1]=-prices[0];//第一天买入利润应该为-prices[0],因为这一天最初利润为0
//填充dp数组
for(int i=1;i<len;i++){
dp[i][0]=max(dp[i-1][1]+prices[i],dp[i-1][0]);
dp[i][1]=max(dp[i-1][0]-prices[i],dp[i-1][1]);
}
//返回最后结果
return dp[len-1][0];//卖出肯定比买入状态的利润高,所以最后返回0状态
}
};
java解法
class Solution {
public int maxProfit(int[] prices) {
int len=prices.length;
int[][] dp=new int[len][2];
//初始化状态
dp[0][0]=0;
dp[0][1]=-prices[0];
//填充dp数组
for(int i=1;i<len;i++){
dp[i][0]=Math.max(dp[i-1][1]+prices[i],dp[i-1][0]);
dp[i][1]=Math.max(dp[i-1][0]-prices[i],dp[i-1][1]);
}
//返回结果
return dp[len-1][0];
}
}
python解法
class Solution:
def maxProfit(self, prices: List[int]) -> int:
l=len(prices)
#创建dp数组
dp=[[0,0]]*l
#初始化状态
dp[0][0]=0
dp[0][1]=-prices[0]
#填充dp数组
for i in range(1,l):
dp[i][0]=max(dp[i-1][1]+prices[i],dp[i-1][0])
dp[i][1]=max(dp[i-1][0]-prices[i],dp[i-1][1])
#返回结果
return dp[l-1][0]