买卖股票问题(Go语言)

给定一个数组 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]
}

  

原文地址:https://www.cnblogs.com/lvpengbo/p/14452359.html