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

乘积最大子数组

乘积最大子数组

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

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 2 * 104
  • -10 <= nums[i] <= 10
  • nums 的任何子数组的乘积都 保证 是一个 32-位 整数

题解:

如果我们用 dp (i) 开表示以第 i 个元素结尾的乘积最大子数组的乘积,a 表示输入参数 nums,那么根据「53. 最大子序和」的经验,我们很容易推导出这样的状态转移方程:

dp[i] = max(dp[i-1] * nums[i], nums[i])

得到如下的代码:

func maxProduct(nums []int) int {
    dp := make([]int, len(nums))
    dp[0] = nums[0]
    maxx := nums[0]
    for i:=1; i < len(nums); i++ {
        dp[i] = max(dp[i-1] * nums[i], nums[i])
        if maxx < dp[i] {
            maxx = dp[i]
        }
    }
	return maxx
}

但是,在这里,这样做是错误的。因为出现负数,负负得正会使得我们的最大值的子问题分解是错误的,解决方法呢是我们需要同时记录最小值,将最小值与当前元素的乘积放在比较选项之中

func maxProduct(nums []int) int {
	MAXX := make([]int, len(nums))
	MINN := make([]int, len(nums))
	MAXX[0], MINN[0] = nums[0], nums[0]
	maxx, minn := nums[0], nums[0]
	for i := 1; i < len(nums); i++ {
        MAXX[i] = max(nums[i], max(MAXX[i-1] * nums[i], MINN[i-1] * nums[i]))
        MINN[i] = min(nums[i], min(MINN[i-1] * nums[i], MAXX[i-1] * nums[i]))
		if maxx < MAXX[i] {
			maxx = MAXX[i]
		}
        if minn < MINN[i] {
			minn = MINN[i]
		}
	}
	return maxx
}

http://www.kler.cn/a/417774.html

相关文章:

  • 视觉语言模型(VLM)学习笔记
  • 乌班图单机(不访问外网)部署docker和服务的方法
  • 【代码随想录|贪心算法02】
  • 【UE5 C++课程系列笔记】06——定时器的基本使用
  • Linux---对时/定时服务
  • 【RabbitMQ 消息列队测试之:调试技巧】
  • 南京移动“智慧+关怀”服务体系助力老年群体生活安全有保障
  • C/C++ 每日一练:在矩阵中查找特定值
  • 异步处理优化:多线程线程池与消息队列的选择与应用
  • Linux - web服务器
  • 算法——反转字符串二(leetcode541)
  • 在Java中使用Apache POI导入导出Excel(四)
  • JMeter参数化redis
  • 【特殊子序列 DP】力扣2501. 数组中最长的方波
  • 【MATLAB源码-第225期】基于matlab的计算器GUI设计仿真,能够实现基础运算,三角函数以及幂运算。
  • 具体的技术和工具在县级融媒体建设3.0中有哪些应用?
  • Zookeeper选举算法与提案处理概览
  • Spring Boot 集成 Knife4j 的 Swagger 文档
  • Unity 超链接文本类
  • 【Oracle11g SQL详解】GROUP BY 和 HAVING 子句:分组与过滤
  • 2062:【例1.3】电影票(https://ybt.ssoier.cn/problem_show.php?pid=2062)
  • 【SPIE出版|四大高校联合举办】先进算法与图像处理技术国际学术会议(IC-AAIP 2025)
  • 十一月第五周python内容
  • 深入理解ARP(三)
  • 【人工智能】深入解析GPT、BERT与Transformer模型|从原理到应用的完整教程
  • 牛客真题:魔法数字变换:JAVA