有上一篇和最大连续数组,那么肯定有乘积最大的连续数组,但是难度可能要高一个级别,因为乘积可能有正负数,而且负负得正这种情况需要判断,这就麻烦了,如果纯粹是非负数,那么将上一篇的求和直接改为相乘即可解决问题。
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],也会出现其他错误,暂时挖个坑,留作下次跟进。
愿我们终有重逢之时,而你还记得我们曾经讨论的话题。