题目1:Best time to buy and sell stock
概述:给一个数组,数组里面的是当日的股票价格,考虑一个算法,算出合适买入卖出得到最大的收益,并返回最大收益。
思路:有三种方法咯,第一就是暴力算法(我这个小傻子能想到的而且还信誓旦旦想着这已经不能再优化了以为时间复杂度就是n平方,呵你这个傻逼。)
结果?结果当然是崩掉了。
第二种:(是看别人讨论知道的呵你自己怎么没有想到)是使用前面 max subarray的kadane方法进行的。我的想法是,把相邻两项之差组成一个数组,求出这个数组的最大子数组则为最大利润(tia 这个方法真的太奇妙了,非常让人震惊)
看看我这个小傻瓜写的:
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
i_cur = i = 0
cur = []
max_so_far = max_current = 0
while i_cur < len(prices)-1:
cur.append(prices[i_cur+1]-prices[i_cur])
i_cur += 1
while i < len(cur):
max_current = self.max_of_two(max_current+cur[i], cur[i])
max_so_far = self.max_of_two(max_so_far, max_current)
i +=1
return max_so_far
def max_of_two(self, f, s):
return f if s<f else s
第三种:(这种方法就更奇妙了我的妈)
你看这张图,又大又圆(什么鬼)。我们从头开始看,我们设立两个变量,一个是最低点(目前最低点),另一个是最大利润。对于当前点来说,如果它是最低点,则证明后面的点与它之差是比前面的大的,所以我们换成最低点,如果不是最低点,我们就和前面的最低点相减得到利润,看看是不是最大利润。这个意思吧,就相当于说,我本来买了股票,然后我每天都可以看看是不是最大利润,诶嘿有一天我发现有一个更低点,我就又买了一个,但是后面的没有前面的利润大,也是可能的,不知道自己再说什么。
喏,代码``
class Solution(object):
def maxProfit(self, prices):
max_profit, min_price = 0, float('inf')
for price in prices:
min_price = min(min_price, price)
profit = price - min_price
max_profit = max(max_profit, profit)
return max_profit