152. 乘积最大子数组

  1. [题目链接](152. 乘积最大子数组 - 力扣(LeetCode))

  2. 解题思路:子数组问题,考虑【以i结尾】结果是什么,求出所有的结果,最大的那个就是结果。

    • 【以i结尾】结果是什么?我们可以利用【i-1】计算过的内容。
      • nums[i]如果是0,那么结果就是0
      • nums[i]如果大于0,那么我们就希望得到【以i-1结尾】的最大的连续正数是什么
      • nums[i]如果小于0,那么我们就希望得到【以i-1结尾】的最大的连续负数是什么
      • 只要维持上述的内容,就可以得到全部【以i结尾】的结果
  3. 代码

    class Solution:
        def maxProduct(self, nums: List[int]) -> int:
            # 子数组   求以i结尾,最大的结果是什么
            # 如果nums[i]是正数,则想要前面最大的正数是多少
            # 如果nums[i]是负数,则想要前面最小的负数是多少
            max_p = 0   # 前面最大的正数 0表示i-1结尾,没有正数
            min_n = 0   # 前面最小的负数 0表示i-1结尾,没有负数
            zero = False # 前面是否有0
            ans = nums[0]
            if nums[0] > 0:
                max_p = nums[0]
            elif nums[0] == 0:
                zero = True
            else:
                min_n = nums[0]
            for i in range(1, len(nums)):
                num = nums[i]
                if num == 0:
                    zero = True
                    max_p = 0
                    min_n = 0
                elif num > 0:
                    if max_p != 0:
                        max_p *= num
                    else:
                        max_p = num
                    zero = False
                    min_n *= num   # 如果前面没有负数,则还是0  如果前面有负数,那么最小的负数会变大
                else:   # num < 0
                    tmp = max_p
                    max_p = num * min_n
                    zero = False
                    if tmp != 0:
                        min_n = num * tmp
                    else:
                        min_n = num
                if zero:
                    ans = max(ans, 0)
                elif max_p != 0:
                    ans = max(ans, max_p)
                else:
                    ans = max(ans, min_n)
            return ans
    
posted @ 2025-01-08 21:22  ouyangxx  阅读(18)  评论(0)    收藏  举报