题解 | #买卖股票的最好时机(二)#

买卖股票的最好时机(二)

https://www.nowcoder.com/practice/9e5e3c2603064829b0a0bbfca10594e9

//吸取教训,任何题目不要固定思维,常规解法也就是贪婪解法可以很容易解
//动态规划解法几乎都是将问题分解成当天是否持有该股票
//并且也没说该怎么引导往这个方向上想
//我觉得冷不丁要想到对我来说还是有难度
//然后我就写一下我的思考过程作为笔记
//首先设定主问题就是以第N天结尾序列的最大收益f(N)(这个是基础)
//最后一天可以确定是不会执行买入操作的。
//所以对最后一天只能选择不动或者卖出操作所以f(N) = max(g(N)(不操作的最大收益),t(N)(卖出操作的最大收益))
//当选择不操作,那么最大的就是以N-1天结尾的最大收益,g(N) = f(N-1)
//当选择卖出操作,那上一次操作一定是买入,有可能在1...N-1任意一天买入,我假设n天买入最大收益为b(n)
//b(n) = f(n-1)-prices[n],第n天买入最大收益等于n-1天最大收益减当天价格
//我要求t(N)是卖出最大收益,则选择b(n)买入收益最大那一天,所以t(N) = max(b(1),b(2)...b(N-1))+prices[N]
//看似他因为b(n)可以由f(n-1)表示,意味着t(N)也可以用f(N-1)表示了,自然可以用动态规划了
//提一点,看似他t(N)每次都要求一个买入的最大值,每次都要判断N-1次
//但是max(b(1),b(2)...b(N-1)) = max(max(b(1),...b(N-2)),b(N-1)),也可以用动态规划,所以复杂度还是n
//越说越复杂···就当是我这个菜鸟最后的挣扎吧,就像看看自己想能不能想出来
func maxProfit(prices []int) int {     // write code here     max := 0     maxbuy := 0 - prices[0]     for i := 1; i < len(prices); i++ {         if maxbuy+prices[i] > max {             max = maxbuy + prices[i]         }         if max-prices[i] > maxbuy {             maxbuy = max - prices[i]         }     }     return max
}
	


全部评论

相关推荐

递归到脑子变傻:杭州还有上位机用VB的,实在没绷住
点赞 评论 收藏
分享
2025-12-06 01:10
已编辑
哈尔滨工程大学 Java
一面问的真细,二面不知为啥变双机位。9.29快手主站平时怎么学习&nbsp;AI&nbsp;的,国内外知名大模型,实习公司都用的什么大模型,怎么评估效果的java池化思想,线程池构造方法的核心参数,线程池中阻塞队列注意事项,submit方法参数和执行逻辑,shutdown和shutdownnow,核心线程允许过期吗threadlocal底层,为什么key是弱引用,key回收了再get或者set这个value会怎样aqs,如何保证公平性java代理java堆划分,新生代还有别的晋升老年代的情况吗,什么时候触发gc,gc失败抛什么异常,如何排查oom,导出dump命令redis数据结构,哪个底层是跳表,和其他数据结构对比布隆过滤器会出现大key问题吗,你咋实现的布隆过滤器你怎么实现redis分布式锁,可重入,续期聚簇索引非聚簇索引select语句会加锁吗,怎么实现的不加锁undolog&nbsp;redolog&nbsp;binlog怎么能让select加锁,update这个范围加的什么锁,update一条呢手撕简单01背包,接雨水10.10快手主站意图识别用的哪个大模型,走到意图和rag的比例,faq是点击的吗自然语言怎么识别的gap一年干啥了,转正怎么样没跟组里提意向吗,研究生研究方向是传统算法吗,会大模型微调吗注册场景为什么用布隆过滤器,原理分布式锁底层的key怎么拼的,value里是什么redis持久化zset底层mysql索引结构,一个表三个字段有主键唯一索引和没索引的字段会有几个b+树,聚簇索引非聚簇索引存的啥无手撕
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务