0
点赞
收藏
分享

微信扫一扫

LeetCode152乘积最大连续数组

蒸熟的土豆 2022-02-10 阅读 52

有上一篇和最大连续数组,那么肯定有乘积最大的连续数组,但是难度可能要高一个级别,因为乘积可能有正负数,而且负负得正这种情况需要判断,这就麻烦了,如果纯粹是非负数,那么将上一篇的求和直接改为相乘即可解决问题。

For Recommendation in Deep learning QQ Group 277356808

For deep learning QQ Second Group 629530787

I'm here waiting for you

1-直接改上个求和的版本,如下,提交力扣有100+通过样例,还有几十例没有通过

class Solution:
    def maxProduct(self, array: List[int]) -> int:
        max=array[0]
        sum=[0]*len(array)
        sum[0]=array[0]
        ans=[]
        for i in range(1,len(array)):
            if sum[i-1]>0 :#or sum[i-1]*array[i]>0:#加上这里通过140个样例
                sum[i]=sum[i-1]*array[i]#只改这里通过84个样例
            else:
                sum[i]=array[i]
            if sum[i]>max:
                max=sum[i]
                ans.append(i)
        return max

2-按照官网java版本改成py的,我看java似乎比cpp容易理解

    def maxProductArray(array):#最大乘积子数组
        maxF, minF, ans = array[0] , array[0] , array[0]
        for i in range(1,len(array)):
            Max,Min = maxF,minF
            maxF = max(Max * array[i], max(array[i], Min * array[i]))
            minF = min(Min * array[i], min(array[i], Max * array[i]))
            ans = max(maxF,ans)
        return ans

 如何求出该数组呢?子数组是啥?上述只是求结果(乘积),修改如下:

    def maxProductArray(array):#最大乘积子数组
        maxF, minF, ans = array[0] , array[0] , array[0]
        ind= []
        for i in range(1,len(array)):
            Max,Min = maxF,minF
            maxF = max(Max * array[i], max(array[i], Min * array[i]))
            minF = min(Min * array[i], min(array[i], Max * array[i]))
            if maxF>ans:
                ans = maxF
                ind.append(i)
            ans = max(maxF,ans)
        return array[ind[0]-1:ind[-1]+1],ans

因为ind在索引循环的时候并没有涉及到第一个,而且中间有比较乘积,自然要加上前面一个索引,后面的索引同上。下面提交测试下:根据子数组进行求乘积。

后来测试发现[0,2]这种数组不对,这时ind=[1],也会出现其他错误,暂时挖个坑,留作下次跟进。

愿我们终有重逢之时,而你还记得我们曾经讨论的话题。 

 

举报

相关推荐

0 条评论