【剑指offer】买卖股票的最好时机(二) [Go语言]

132 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目

假设你有一个数组prices,长度为n,其中prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益 1.你可以多次买卖该只股票,但是再次购买前必须卖出之前的股票

2.如果不能获取收益,请返回0

3.假设买入卖出均无手续费

示例1

输入:

[8,9,2,5,4,7,1]

返回值:

7

说明:

在第1天(股票价格=8)买入,第2天(股票价格=9)卖出,获利9-8=1
在第3天(股票价格=2)买入,第4天(股票价格=5)卖出,获利5-2=3
在第5天(股票价格=4)买入,第6天(股票价格=7)卖出,获利7-4=3
总获利1+3+3=7,返回7        

思路

这道题很简单,就是每一轮都遍历过去就好了。

因为我们其实就是比较相邻两个的大小而已,如果后面比前面的大,就可以卖出去了,如果后面比前面的小,可以直接跳过。

AC Code 法一

func maxProfit( prices []int ) int {
(1)    sum := 0
(2)    for i:=1;i<len(prices);i++{
(3)        if prices[i]>prices[i-1]{
(4)            sum += prices[i]-prices[i-1]
        }
    }
(5)    return sum
}
  • (1) 定义一个sum作为初始的变量
  • (2) 不断遍历prices数组
  • (3) 如果后一个比前一个大
  • (4) 就把这个差值累加起来
  • (5) 返回sum

AC Code 法二

dp 动态规划思想

我们也可以使用dp 动态规划的思想,

动态规划状态方程:dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])

只要比较相邻的元素,在之前的状态和现在的状态选一个值,选出最大值,我们动态进行相加即可。

func maxProfit( prices []int ) int {
    n := len(prices)
    if n == 0 {
        return 0
    }
    dp := make([][2]int, n)
    dp[0][0] = 0
    dp[0][1] = -prices[0]
    for i := 1; i < n; i ++ {
        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]
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}