Best Time to Buy and Sell Stock II

本文深入探讨了编程与数学逻辑的紧密联系,通过分析BestTimeToBuyAndSellStock问题,阐述了如何利用数学思维优化算法。从O(n^2)到O(n)的时间复杂度改进,分享了解决方案的关键思路。

Best Time to Buy ans Sell Stock

最近越来越觉得编程就是数学问题,数学的逻辑思维决定了写出的程序的质量。在做这道题的时候越发觉得如此。

题目简介

这个题目分为两个系列,分别是III,其中I是II的简单版本。
刚做I时感觉很简单,对于O(n^2)和O(n)时间复杂度的版本能够很快给出解决方法。但是对于II,第一眼看过去并没有明显的思路,于是乎就耐心研究了起来。

解题方法

首先是分析卖出条件

假设一列数据[a1, a2, ..., ax, ..., aa, ab, ..., ac, ...],在aa之前已经买入为ax,根据题目要求可值,ax只有一个

ax的限制要求

在(ax,..., aa]范围内,ax应该都是最小的,如果存在ay < ax,则ax的收益肯定比ay少,则买入点ay肯定比ax要更优。

卖出点要求

现在状态是: ax是买入点,现在需要判断是aa点是否可以卖出?

考虑[ax, ..., ac]之间的收益

  • 若ac为卖出点时,整个区间的收益为:ac - ax
  • 若中间某点卖出,然后再买入,区间收益为:aa - ax + ac - ab

由于要使收益最大化,因此:

aa - ax + ac - ab > ac - ax ==> aa > ab

也就是说,只要aa大于ab即可卖出,以使得收益最大化,根据这点即可写程序获取到改题的求解方法。相应的代码放在GitHub上了,欢迎提改进意见。

总结

解决问题遇到没有思路时,好好分析中间条件,可以更有助于捋顺思路。还是要好好学习数学啊!

转载于:https://www.cnblogs.com/chinazhonghao/p/10011415.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值