Leetcode 121. 买卖股票的最佳时机(717)

题目

26年7月17日(首刷小部分自解)

Go 复制代码
func maxProfit(prices []int) int {
    //之前贪心也做过类似的题目,那个时候是用flag标志表示持有或者不持有股票,
    //dp[i][j],含义,在第i天时,持有状态为j的情况下,能获得的最大利润
    dp:=make([][]int,len(prices)+1)//下标[0,len(prices)]
    for i,_ :=range dp{
        dp[i]=make([]int,2)
    }
    dp[0][0]=0
    dp[0][1]=-10000
    for i:=1;i<=len(prices);i++{
        dp[i][0]=max(dp[i-1][1]+prices[i-1],dp[i-1][0])//卖出了那么之前是负债状态dp[i-1][1]要保留
        dp[i][1]=max(-prices[i-1],dp[i-1][1])
        //不可以无限次交易,没买之前,都是0,所以就是0
    }
    return dp[len(prices)][0]
}

思路

这道题其实不久前类似的贪心做过

先给我最开始的版本吧(大错版

css 复制代码
func maxProfit(prices []int) int {
    //之前贪心也做过类似的题目,那个时候是用flag标志表示持有或者不持有股票,
    //dp[i][j],含义,在第i天时,持有状态为j的情况下,往后可以获得的最大利润
    dp:=make([][]int,len(prices)+1)//下标[0,len(prices)]
    for i,_ :=range dp{
        dp[i]=make([]int,2)
    }
    dp[len(prices)][1]=prices[len(prices)-1]
    dp[len(prices)][0]=0
    for i:=len(prices)-1;i>=1;i--{
        dp[i][1]=max(dp[i+1][0]+prices[i-1],max(dp[i+1][1],dp[i+1][0]))
        dp[i][0]=max(dp[i+1][1]-prices[i-1],dp[i+1][0])
    }
    return max(dp[0][0],dp[0][1])
}

我也不知道写的是啥,反正就是交错盘杂思路不清晰,而且没有考虑到就是当天不能重复购入卖出问题。 只有dp数组写的是对的,这里是0代表没持有,1代表持有

然后正确代码中首先,思路是这样的,当天有两种情况,一种持有股票,一种是没有股票

当天没有股票:有两种情况,要么是持有但是今天卖出了,要么是今天之前就没有,对应的递推公式就是

dp[i][0]=max(dp[i-1][1]+prices[i-1],dp[i-1][0])//卖出了那么之前是负债状态dp[i-1][1]要保留

当天有股票,有两种情况,要么是今天之前都没有,但是今天买入了,要么就是在今天之前就持有了,对应的递推公式就是

dp[i][1]=max(-prices[i-1],dp[i-1][1])

注意这里提到股票不能反复买卖,我们就可以可以思考,今天买入,意味着之前是一直没有买了那么就更不可能卖了,意味着如果今天买,之前肯定不会有利润,金额为0,所以今天买入总金额相当于0-pricesi-1

这里我也有疑问,为什么当天没有股票时,却是dp[i-1][1]+prices[i-1]这样而不是prices[i-1]呢后面想了一下,这里是今天卖出的情况,今天卖出了之前肯定就买了,之前买了还没卖的时候肯定金额是负债的情况,负债不就是相当于dpi1中的-pricesi-1吗。

值得注意的是,如果允许反复购买其实很简单,就是把-prices[i-1]变成dp[i-1][0]-prices[i-1],代表着就算今天卖出了之前还是有利润dp[i-1][0]可能的

相关推荐
OYYHXPJR11 分钟前
【算法】区间重叠模板和矩形重叠模板
算法
shehuiyuelaiyuehao13 分钟前
算法46,分治快排,排序数组
java·算法·排序算法·排序
JaguarJack14 分钟前
Whim 是什么?一门把 PHP 被否决的设想真跑起来的实验语言
后端·php·服务端
明月_清风26 分钟前
MHS:AI Agent 开始连接物理世界
人工智能·后端·网络协议
远航计算机29 分钟前
GEO 选题从哪来?用一份 Query 词库把一年内容排出来
大数据·人工智能·算法·aigc
宣宣猪的小花园.30 分钟前
【机器学习】神经网络与表征:为什么深度学习能自动提取特征
人工智能·嵌入式硬件·算法·机器学习
ssshooter35 分钟前
Node.js 天生就是异步的,为什么还要消息队列?
javascript·后端·面试
mmmmath_344 分钟前
LeetCode.018.四数之和
数据结构·算法·leetcode
AIGCmagic社区1 小时前
腾讯混元 AuK 技术报告拆读:1.5B 统一语音生成与编辑,蒸馏后 4 步无 CFG 提速 4.5 倍
人工智能·算法·aigc·ai多模态
大熊背1 小时前
基于照明色度表征的颜色恒常性的白平衡算法实现
算法·白平衡·色温·色度坐标·普朗克曲线