当前位置: 首页 > news >正文

每日一题 ~乘积最大子数组

 

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/maximum-product-subarray/description/
题目分析

题目要求找出给定整数数组中乘积最大的连续子数组,并返回这个乘积。

思路分析

这道题可以使用动态规划来解决。关键是维护两个状态数组 fg,其中:

  • f[i] 表示以第 i 个元素结尾的最大子数组乘积;
  • g[i] 表示以第 i 个元素结尾的最小子数组乘积。

为什么需要维护最小值 g[i] 呢?因为负数乘以负数会变成正数,所以需要同时维护最大值和最小值来应对乘积的变化情况。

状态转移方程

对于第 i 个元素:

  • f[i] 的计算方式:
    • f[i] = max(nums[i], f[i-1] * nums[i], g[i-1] * nums[i])
    • 即当前元素自身、前一个最大乘积乘以当前元素、前一个最小乘积乘以当前元素的最大值。
  • g[i] 的计算方式:
    • g[i] = min(nums[i], f[i-1] * nums[i], g[i-1] * nums[i])
    • 即当前元素自身、前一个最大乘积乘以当前元素、前一个最小乘积乘以当前元素的最小值。

初始化

初始状态为:

  • f[0] = nums[0]
  • g[0] = nums[0]

最终结果

最终结果即 f 数组中的最大值,即为整个数组中乘积最大的连续子数组的乘积。

代码实现 

package study1.day12;
/*
*152. 乘积最大子数组
*       思路分析:
*             1.状态表示 f[i]以i位置为结尾的最大子数组的和
*                       g[i]以j位置为结尾的最小子数组的和
*                           在最大值中 > 0 乘最大值   < 0 乘最小值
*             2.状态转移方程 f[i] = max(sum[i],sum[i] * f[i - 1],sum[i] * g[i - 1])
*                           在最小值中 > 0 乘最最小值   < 0 乘最大值
*                          g[i] = min(sum[i],sum[i] * g[i - 1],sum[i] * f[i - 1])
*             3.初始化 f[0] = 1  g[0] = 1 (任何数 * 1都等于任何数)*
*           总结一下: 本题主要是两个dp一个记录最大 一个记录最小
*                       因为本题存在负数当为负数的时候最大值就会变成最小值然后再转换
*                       所以本题一定要分正数在划分一下dp的最小状态
* */
public class test5 {public int maxProduct(int[] nums) {int n = nums.length;//1.创建f g 数组用来存储历史记录int[] f = new int[n];int[] g = new int[n];//2.初始化f[0] = g[0] = 1;int retMax = Integer.MIN_VALUE;//3.填表for (int i = 1; i <= n; i++) {f[i] = Math.max(Math.max(nums[i - 1],f[i - 1] * nums[i - 1]),g[i - 1] * nums[i - 1]);retMax = Math.max(retMax,f[i]);g[i] = Math.min(Math.min(nums[i - 1],g[i - 1] * nums[i - 1]),f[i - 1] * nums[i - 1]);}return retMax;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 捷径,这世上有没有捷径
  • 【医疗大数据】健康分析法应用于商业领域的文献回顾
  • 异常概述及其抛出与捕获机制
  • clang 编译cuda原理
  • C++初学(8)
  • CS224W—03 GNN
  • 代码随想录算法训练营第五十三天|739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II
  • Linux下的网络通讯
  • 电测量数据交换DLMS_COSEM组件第47部分:基于IP网络的DLMS_COSEM传输层
  • Linux用户-普通用户
  • 树上dp学习总结2
  • SpringMVC中的常用注解
  • stl-algorithm【1】
  • 【错误总结】Ubuntu系统中执行 sudo apt-get update报错
  • 随着人工智能技术的发展,如何确保其决策过程的透明度和可解释性,以避免潜在的不公正和歧视?
  • Google 是如何开发 Web 框架的
  • 【技术性】Search知识
  • AngularJS指令开发(1)——参数详解
  • CSS盒模型深入
  • eclipse的离线汉化
  • export和import的用法总结
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • IP路由与转发
  • Spark RDD学习: aggregate函数
  • vuex 学习笔记 01
  • 缓存与缓冲
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 京东美团研发面经
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 三分钟教你同步 Visual Studio Code 设置
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 正则表达式小结
  • No resource identifier found for attribute,RxJava之zip操作符
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #Linux(帮助手册)
  • (BFS)hdoj2377-Bus Pass
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (k8s)kubernetes集群基于Containerd部署
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (第一天)包装对象、作用域、创建对象
  • (二)pulsar安装在独立的docker中,python测试
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (三)c52学习之旅-点亮LED灯
  • (十三)Maven插件解析运行机制
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)ABI是什么
  • (转)Sublime Text3配置Lua运行环境
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .gitignore文件_Git:.gitignore
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .Net 6.0 处理跨域的方式
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能