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上了,欢迎提改进意见。

总结

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

posted on 2018-11-24 12:30  晨暮  阅读(116)  评论(0编辑  收藏  举报