<每日一题>算法导论:最大股票收益

来源:互联网 发布:广州蛋糕店哪家好 知乎 编辑:程序博客网 时间:2024/05/17 01:57

一.抽象:
给定一个数组,求出数组中两数之差的最大值,被减数下标大于减数
二.方法:
1.分治法:
a.将数组分成左右两部分
b.分别求出两部分的最大值,最小值,以及下标大的数与下标小的数之差的最大值。
c.合并两部分的结果

时间为O(nlogn)

2.转化为最大子数组和问题:
a.先求出数组的前一个数与后一个数之差,组成新的数组
b.求新数组的最大子数组和
(原理:假设原数组(长度为n)为l[0…n-1],新数组为d[0…n-2],其中d[i]=l[i+1]-l[i],当求出d的最大子数组为d[x…y]时,则有:
l[x+1]-l[x] + l[x+2]-l[x+1] … l[y+1]-l[y] = l[y+1]-l[x]
也就求得原数组两数之差的最大值)

时间为O(n)

三.代码(python ):
1.分治法:

def get_max_diff_partition(l,start,end)    mid=int((start+end)/2)    #Max对应数组从startend的最大值    #Min对应数组从startend的最小值    #d_max对应数组从startend的下标大的数与下标小的数之差的最大值    if start==end:        Max=l[start]        Min=l[start]        d_max=0        return Min,Max,d_max    Max_l,Min_l,d_max_l = get_max_diff_partition(l,start,mid)    Max_r,Min_r,d_max_r = get_max_diff_partition(l,mid+1,end)    #合并左右两个数组    d_max_mid = Max_r - Min_l    d_max = max(d_max_l,d_max_mid,d_max_r)    Min=min(Min_l,Min_r)    Max=max(Max_l,Max_r)    return Min,Max,d_max

2.最大子数组法:

def get_diff_max_best(l):    length=len(l)    #求出前一天与后一天的差值    diff=[]    for i in range(length-1):        diff.append(l[i+1]-l[i])    max_sum=0    cur_sum=0    for d in diff:        if cur_sum+d>0:            cur_sum+=d        else:            cur_sum=0        if cur_sum>max_sum:            max_sum=cur_sum    return max_sum 
阅读全文
0 0
原创粉丝点击