Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • 数组

    • 搜索

    • 二分查找

    • 排序

    • 边界判断

    • 双指针法

    • 连续子数组

      • 128.最长连续序列
      • 209.长度最小的子数组
      • 718.最长重复子数组
      • 152.乘积最大子数组
      • 581. 最短无序连续子数组
      • 918. 环形子数组的最大和
    • 差分数组

    • 模拟

    • 区间问题

  • 链表

  • 字符串

  • 二叉树

  • 动态规划

  • 深搜回溯

  • 数学贪心

  • 堆栈队列

  • 前缀和

  • 算法设计

  • 位运算

  • WA

  • 算法
  • 数组
  • 连续子数组
phan
2023-05-16

152.乘积最大子数组

# 152.乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

输入: [2,3,-2,4] 输出: 6

  1. 一开始想法是压缩数组,因为题目保证数组元素都是整数,因此可以把连续的正整数子数组压缩为它们的乘积,之后再用双指针法遍历压缩后的数组,但是求最大乘积时情况比较复杂,要判断两个指针之间有一个负数?负数之间是否插有整数?碰到0又该怎么处理?可以达到时间O(n)空间O(1)。

  2. 动规。起初想用动规的时候发现,如果定义dp[i]表示插入nums[i]形成的最大子数组乘积,状态转移方程: dp[i]=max(nums[i],dp[i-1]*nums[i]),最大乘积子数组会从负号断开,错过两个负号构成的最大子数组乘积的情况,就没使用动规。实际上,可以定义一个dpmax[i]表示插入nums[i]形成的最大子数组乘积,再定义dpmin[i]表示插入nums[i]形成的最小子数组乘积,这样子dpmax[i]就会有三种情况,如果nums[i]为正数,要么最大子数组没有断开dpmax[i]=dpmax[i-1]*nums[i],要么前面为负数,nums[i]另起一个最大子数组作为最左端dpmax[i]=nums[i]。而如果nums[i]为负数,它可能作为前面连续子数组中第二个负数dpmax[i]=dpmin[i-1]*nums[i]。因此状态转移方程有:

    dpmax[i]=Math.max(nums[i],dpmax[i-1]*nums[i],dpmin[i-1]*nums[i]);

    dpmin[i]=Math.min(nums[i],dpmax[i-1]*nums[i],dpmin[i-1]*nums[i]);

编辑 (opens new window)
#Leetcode#子数组
上次更新: 2023/12/15, 15:49:57
718.最长重复子数组
581. 最短无序连续子数组

← 718.最长重复子数组 581. 最短无序连续子数组→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式