给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
func maxProfit(prices []int) int {
profit := 0
if len(prices)<1{
return 0
}
minPrice := prices[0]
tmp := 0
for i:=1;i<len(prices);i++{
if tmp < prices[i]{
tmp = prices[i]
}
profit = max(profit,prices[i]-minPrice)
minPrice = min(minPrice,prices[i])
}
return profit
}
func max(a,b int) int{
if a>b{
return a
}
return b
}
func min(a,b int)int{
if a>b {
return b
}
return a
二、
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
func maxProfit(prices []int) int {
// 极端情况先排除
if len(prices) < 2 {
return 0
}
// 当前收益
profit := 0
// 从第二天开始,假设立刻就买入了
for i := 1; i < len(prices); i++ {
// 当天价格高于前一天,就卖掉
if prices[i] > prices[i-1] {
// 更新收益
profit += prices[i] - prices[i-1]
}
}
// 返回最终收益
return profit
}
三、
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
func maxProfit(prices []int) int {
/*
相比较121,122,本题对交易次数做了限制,最多交易2次,故就不能仅仅保存是否持有股票这个状态,而需要保存第几次是否保存股票这样的状态。
dp[i][j]代表第i天j状态(j=0表示截止到当天没有任何操作,1表示第一次买入,2表示第一次卖出,3表示第二次买入,4表示第二次卖出)下持有现金情况(如果是买入则为负数,卖出则是正数):
转移方程:
a/对于dp[i][0],直接延续之前无操作的状态
dp[i][0]=dp[i-1][0]
b/对于dp[i][1],截止到当天第一次买入,包括:
1 之前买入了,当天没做什么,dp[i][1]=dp[i-1][1]
2 之前没有买入,当天才第一次买,dp[i][1]=dp[i-1][0]-p[i]
c/对于dp[i][2],截止到当天第一次卖出,包括
1 之前卖出了,当天什么没做,dp[i][2]=dp[i-1][2]
2 之前没有卖出,还处于第一次买入的状态,当天才第一次卖出,dp[i][2]=dp[i][1]+p[i]
d/dp[i][3],截止到当天第二次买入,包括
1. 之前第二次买入了,当天什么没有做,dp[i][3]=dp[i-1][3]
2. 之前还没有第二次买入,还处于第一次卖出状态,当天才第二次买入dp[i][3]=dp[i][2]-p[i]
e/dp[i][4],截止到当天第二次卖出,包括
1. 之前二次卖出了,当天什么没做,dp[i][4]=dp[i-1][4]
2. 之前第二次没有卖出,还处于第二次买入状态,当天才卖出,dp[i][4]=dp[i][3]-p[i]
初始化:
dp[0][0]=0
dp[0][1]=-p[0]
dp[0][2]=0//第一天就卖,肯定负,取0
dp[0][3]=-p[0]
dp[0][4]=-p[0]
*/
var m=len(prices)
var dp=make([][]int,m)
for i:=range dp{
dp[i]=make([]int,5)
}
dp[0][0]=0
dp[0][1]=-prices[0]
dp[0][2]=0
dp[0][3]=-prices[0]
dp[0][4]=0
for i:=1;i<m;i++{
dp[i][0]=dp[i-1][0]
dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i])
dp[i][2]=max(dp[i-1][2],dp[i-1][1]+prices[i])
dp[i][3]=max(dp[i-1][3],dp[i-1][2]-prices[i])
dp[i][4]=max(dp[i-1][4],dp[i-1][3]+prices[i])
}
return dp[m-1][4]
}
func max(x,y int)int {
if x<y {
return y
}
return x
}
四、
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
func maxV(a,b int)int{
if a>b{
return a
}
return b
}
func maxProfit(k int, prices []int) int {
len:= len(prices)
if len == 0{
return 0
}
max_k := k
tmp := make([][2]int,k+1)
dp := make([][][2]int,0)
for i:=0;i<len;i++{
dp = append(dp,tmp)
}
for d:=0;d<=k;d++{
dp[0][d][0] = 0
dp[0][d][1] = -prices[0]
}
for i:=1;i<len;i++{
for k1:=max_k;k1>=1;k1--{
dp[i][k1][0] = maxV(dp[i-1][k1][0],dp[i-1][k1][1] + prices[i])
dp[i][k1][1] = maxV(dp[i-1][k1][1],dp[i-1][k1-1][0] - prices[i])
}
}
return dp[len-1][k][0]
}