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
}