QUESTION问题
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4],the contiguous subarray [2,3] has the largest product = 6.
SOLUTION
# 复杂版本
#开始想了一个复杂版本,从最大size的数组出发,进行遍历。
比如数组长度为5,那么我就
1 先计算长度为4的所有数组的积
2 再计算长度为3的所有数组的积
....
3 逐步计算更新我的maxProduct值。
这样做遍历次数有,1+2+3+...+len(arr)=O(n的平方)的复杂度
# def maxProduct(A): # #k=len(A) # #A=[2,3,-2,4] # prd=1 # max=-10000 # for size in range(0,len(A)):#4-->1 # size=len(A)-size # for pos in range(0,len(A)-size+1): #3的时候 # prd=1 # start=pos # for k in range(size): # prd*=A[start] # start+=1 # if prd>max: # max=prd # return max
for i in A: if(i>0): upperPrd=max(upperPrd*i,i) #向上抽取, #如果前连续积*i>当前值,那么连续积就继续乘下去upperPrd=upperPrd*i #反之,如果i自己比较大,那么就从i开始为upperPrd新立门户 lowerPrd=lowerPrd*i maxPrd=max(upperPrd,maxPrd) elif(i<0): temp=lowerPrd lowerPrd=min(upperPrd*i,i) #向下抽取,如果是i的时候,那么就从新开始玩 upperPrd=temp*i maxPrd=max(upperPrd,maxPrd)
2 如果一段时间内我们的连续积有0出现了,那么我们需要在之前的基础上进行一点修改了。---------------------------------------------
比如 [1 -2 3 4 0 9 8 ]
我们在之前计算了半天的东西到了0的时候,都功亏一魁了。
怎么办呢?
这个时候我们只需要遇到0的时候重置一下upperPrd,lowerPrd和maxProduct就行了,后面的步骤继续照着此前讲的计算就行了
整体代码-------------------------------------------------------------------------------------------------------------
class Solution: # @param A, a list of integers # @return an integer def maxProduct(self, A): maxPrd=-10000 upperPrd=1 lowerPrd=1 #跑的时候记录在当前位置的一个正的和负的连续集cursor,一旦为0,从头算起, #是不是最大值这件事全交给maxPrd来记录,正负集子不管 for i in A: if(i>0): upperPrd=max(upperPrd*i,i) #向上抽取,如果是i的时候,那么就从新开始玩 和下一行不可调换 lowerPrd=lowerPrd*i maxPrd=max(upperPrd,maxPrd) elif(i<0): temp=lowerPrd lowerPrd=min(upperPrd*i,i) #向下抽取,如果是i的时候,那么就从新开始玩 upperPrd=temp*i maxPrd=max(upperPrd,maxPrd) else: upperPrd=1 lowerPrd=1 maxPrd=max(maxPrd,i)# 遇到输入A=[0]的情况,可以将maxPrd置为0 return maxPrd