leetcode热题100.乘积最大子数组(动态规划进阶)

 作者:晓宜🌈🌈🌈

携程javaer,阿里云专家博主,csdn后端优质创作者 ❤️❤️❤️

今天给大家带来一道动态规划的算法题,希望对大家秋招找工作有帮助🍗🍗🍗

题目

https://leetcode.cn/problems/maximum-product-subarray/description/

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续

子数组

(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

测试用例的答案是一个 32-位 整数。

示例 1:

输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:

输入: nums = [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

思路

我选择使用动态规划的方法来解题。具体而言,我们需要维护两个变量:当前子数组的最大乘积和最小乘积。这是因为负数的存在会使得最大乘积和最小乘积互换,所以在每一步,我们需要考虑当前元素的正负性,更新这两个变量,以便在最终得到全局的最大乘积。

解题过程

  1. 初始化三个变量:

    • ans 用来记录最终的最大乘积,初始值设为一个很小的负数(确保它会被第一个元素更新)。
    • minvmaxv 分别用来记录到当前元素为止的最小乘积和最大乘积,初始值都设为 1。
  2. 遍历数组 nums,对每个元素 nums[i]

    • 如果 nums[i] 是负数,交换 minvmaxv,因为负数会把最大的乘积变成最小的乘积,反之亦然。
    • 更新 maxvmax(maxv * nums[i], nums[i]),即当前元素的最大乘积是前一步的最大乘积乘以当前元素或当前元素自身(当当前元素大于前一步的最大乘积乘以当前元素时)。
    • 更新 minvmin(minv * nums[i], nums[i]),即当前元素的最小乘积是前一步的最小乘积乘以当前元素或当前元素自身。
    • 更新 ansmax(ans, maxv),即在每一步都更新全局的最大乘积。
  3. 最后返回 ans,即为整个数组的最大子数组乘积。

复杂度

  • 时间复杂度: O(n),因为我们只需遍历数组一次。
  • 空间复杂度: O(1),因为我们只使用了常数个额外空间。

Code

class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        n = len(nums)
        ans = -1000000
        minv = maxv = 1
        for i in range(n):
            if nums[i] < 0:
                minv,maxv = maxv,minv
            
            maxv = max(maxv*nums[i],nums[i])
            minv = min(minv*nums[i],nums[i])

            ans = max(ans,maxv)
        return ans

这个代码通过在遍历数组时动态更新最小乘积和最大乘积,并在每一步更新全局最大乘积,从而找到最大的子数组乘积。

相关推荐

  1. leetcode100.乘积数组动态规划

    2024-07-17 15:22:03       24 阅读
  2. 乘积数组 - LeetCode 88

    2024-07-17 15:22:03       28 阅读
  3. Leecode100--53:数组之和

    2024-07-17 15:22:03       29 阅读
  4. leetcode100.完全平方数(动态规划

    2024-07-17 15:22:03       43 阅读
  5. leetcode100.单词拆分(动态规划

    2024-07-17 15:22:03       27 阅读
  6. LeetCode100】【动态规划长递增序列

    2024-07-17 15:22:03       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 15:22:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 15:22:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 15:22:03       58 阅读
  4. Python语言-面向对象

    2024-07-17 15:22:03       69 阅读

热门阅读

  1. 二叉树---二叉树的最大深度

    2024-07-17 15:22:03       20 阅读
  2. AI技术在企业招聘中的应用案例分析

    2024-07-17 15:22:03       25 阅读
  3. 土土土土土土土土圭

    2024-07-17 15:22:03       22 阅读
  4. ElasticSearch学习之路

    2024-07-17 15:22:03       22 阅读
  5. android include 和 merge 区别

    2024-07-17 15:22:03       20 阅读
  6. python基础篇(12):继承

    2024-07-17 15:22:03       23 阅读
  7. Spring解决循环依赖问题的四种方法

    2024-07-17 15:22:03       19 阅读
  8. 人工智能与人类社会的共生共荣

    2024-07-17 15:22:03       19 阅读