zoukankan      html  css  js  c++  java
  • 买卖股票问题(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]
    }
    

      

  • 相关阅读:
    linux安装日志切割程序
    Linux下安装JDK
    深入理解Java注解类型(@Annotation)
    23种设计模式--代理模式-Proxy
    23种设计模式--建造者模式-Builder Pattern
    23种设计模式--工厂模式-Factory Pattern
    23种设计模式
    Java集合框架学习笔记
    MySQL入门笔记(一)
    二进制运算基础
  • 原文地址:https://www.cnblogs.com/lvpengbo/p/14452359.html
Copyright © 2011-2022 走看看