买股票的最佳时机||
1.题目要求
给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
作者:力扣 (LeetCode)
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/x2zsx1/
来源:力扣(LeetCode)
*理解与题解:
贪心算法
不用陷入第二天股价未知的误区。只需要找到股票上涨的最大值和股票开始上涨的最小值,计算他们的差就是这段时间内股票的最大利润
例如【1,2,3,4,5】
①第一天买入第二天卖出赚2-1=1,第二天买入第三天卖出3-2=1,第三天买入第四天卖出4-3=1,第四天买入第五天卖出5-4=1,共赚4;
②第一天买入,第五天卖出5-1=4.
结果相同过程不同。
例如【7,1,5,3,6,4】
①第一天买入第二天卖出是负的不计入(第一天不买),第二天买入第三天卖出5-1=4,第三天买入第四天卖出3-5为负(第三天不买)四买五卖6-3=3,五买六卖负的(不买入)4+3=7,赚7.
java:
class Solution {
public int maxProfit(int[] prices) {
// java贪心算法
int n = prices.length;
int ans = 0;
for(int i=1;i<n;i++){
ans+=Math.max(0,prices[i]-prices[i-1]);
}
return ans;
}
}
python:
class Solution(object):
def maxProfit(self, prices):
"""
python 贪心算法
:type prices: List[int]
:rtype: int
"""
ans = 0
for i in range(1,len(prices)):
ans+=max(0,prices[i]-prices[i-1])
return ans
动态规划
1.定义状态
用二维数组表示,第一维表示第i天,第二维表示这一天手里有没有股票(0表示没有,1表示有)。
dp[i][0]表示第i天手里没有股票。
dp[i][1]表示第i天手里有股票
2.初始条件
第一天不买则手里没有股票,初始就是dp[0][0]=0;
第一天买入则需要花掉第一天的股价:dp[0][1] = -prices[0]
3.状态转移
如果这一天手里没有股票:则只有两种可能①前一天也没有股票,今天也没有买入dp[i-1][0];②前一天有股票,今天卖出去了dp[i-1][1]+prices[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]);
注:两个状态没有先后顺序。
4.返回值
由于交易结束后,手里有股票的收益 < 手里没有股票的,
所以返回没有股票的dp[n-1][0];
java
class Solution {
public int maxProfit(int[] prices) {
//java
int n = prices.length;
//初始条件
int dp[][] = new int[n][2];
//第二个0表示手里没有股票 1表示有股票
dp[0][0] = 0;
dp[0][1] = -prices[0];
for(int i=1; i<n; 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[n-1][0];
}
}
python
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
n = len(prices)
dp = [[0]*2 for _ in range(n)]
dp[0][0]= 0
dp[0][1]=-prices[0]
for i in range(1,n):
dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i])
dp[i][1] = max(dp[i-1][1],dp[i-1][0]-prices[i])
return dp[n-1][0]