今日分享 – 77 – 乘积最大子序列

有一个整数类型的nums,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)

案例:

data = 1, 2, -2, -1, 5, -4

输出20,子序列: -1, 5, 4

'''
nums = [1, 2, -2, -1, 5, -4]

i = 3, j = 5

mul(i, j) = mul(0, j) / mul(0, i)

0: 需要重新开始
< 0: 应该找到前面最大的复负数
> 0; 最小的正数
'''

def maxMul(nums):
    if not nums: return
    # 目前的累乘
    cur_mul = 1
    
    # 前面最小的正数
    min_pos = 1
    
    # 前面最大的负数
    max_neg = float('-inf')
    
    # 结果
    result = float('-inf')
    
    for num in nums:
        cur_mul *= num
        
        if cur_mul > 0:
            result = max(result, cur_mul // min_pos)
            min_pos = min(min_pos, cur_mul)
        elif cur_mul < 0:
            if max_neg != float('-inf'):
                result = max(result, cur_mul // max_neg)
            else:
                result = max(result, num)
            max_neg = max(max_neg, cur_mul)
        else:
            cur_mul = 1
            min_pos = 1
            max_neg = float('-inf')
            result = max(result, num)
    return result

data = [1, 2, -2, 0, 5, -4]
data2 = [0, 0, 0]
print(maxMul(data))
print(maxMul(data2))

5

0

正文完