leetcode刷题250天(25)——152. 乘积最大子数组

该博客介绍了一个Python实现的算法,用于在包含正数、负数和零的数组中找到乘积最大的子序列。算法首先通过特殊处理零来拆分数组,然后分别从前往后和从后往前计算子序列的乘积,最后判断最大乘积的子序列是否全为负数,以确定最终结果。
摘要由CSDN通过智能技术生成
class Solution(object):
    def maxProduct(self, arr):
        if len(arr) == 0:
            return 0
            
        if len(arr) == 1:
            return arr[0]

        # 以0为单位拆分
        def deal(list_ori,p):   
            list_new=[]
            list_short=[]
            for i in list_ori:
                if i!=p:		
                    list_short.append(i)
                else:
                    list_new.append(list_short)
                    list_short=[]
            list_new.append(list_short)
            return list_new

        # 判断列表是否全负
        def negative(arr):
            for i in arr:
                if i > 0:
                    return False
            return True


        BigNums = deal(arr, 0)
        BigArr = []
        for nums in BigNums:
            if nums == []:
                continue

            base = 1
            maxValue = nums[0]
            for i in range(len(nums)):
                base *= nums[i]
                if maxValue < base:
                    maxValue = base
                if nums[i] == 0:
                    base = 1 

            base = 1
            for i in range(len(nums)-1, -1, -1):
                base *= nums[i]
                if maxValue < base:
                    maxValue = base
                if nums[i] == 0:
                    base = 1
            BigArr.append(maxValue)
            
        # 最大值列表中 BigArr 如果全为负 且源数据存在0则 返回0
        # 否则返回BigArr中最大值
        return 0 if len(BigNums) >= 2 and negative(BigArr) else max(BigArr)
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值