动态规划-乘积最大子数组

ops/2024/9/25 21:23:03/

题目描述

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续 子数组 (该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 测试用例的答案是一个 32-位 整数。

152. 乘积最大子数组 - 力扣(LeetCode)

解题思路

使用了两个动态规划数组 f 和 g 来分别跟踪到当前位置为止,乘积最大和最小的子数组乘积。这是基于以下观察:

  1. 最大乘积(f 数组):在遍历数组时,对于每个位置 i,最大乘积要么是当前元素 nums[i] 本身(如果前面的元素都是负数或者乘积小于当前元素),要么是前面位置的最大乘积 f[i-1] 乘以当前元素 nums[i](如果前面的乘积是正数或者0)。但是,当遇到负数时,我们需要考虑前一个位置的最小乘积 g[i-1] 乘以当前负数 nums[i] 是否能产生新的最大乘积(因为负数乘以负数会变成正数)。

  2. 最小乘积(g 数组):与最大乘积类似,最小乘积的更新也考虑了当前元素、前一个位置的最小乘积乘以当前元素,以及前一个位置的最大乘积乘以当前元素(当当前元素为负数时)。这是因为,负数乘以正数(前一个位置的最大乘积)会得到一个更小的负数,这可能是新的最小乘积。

上述的动态规划思路与此前的最大子数组和一题相似。

在遍历过程中,f 和 g 数组被逐步构建,并且我们始终保持 f 数组中的最大值作为当前已知的最大乘积。遍历完成后,f 数组中的最大值即为所求的最大乘积子数组的乘积。

代码示例

class Solution {
public:int maxProduct(vector<int>& nums) {int n = nums.size();vector<int> f(n, 0); // 乘积最大的子数组vector<int> g(n, 0); // 乘积最小的子数组f[0] = g[0] = nums[0];for (int i = 1; i < n; i++) {if (nums[i] > 0) {f[i] = max(nums[i] * f[i - 1], nums[i]);g[i] = min(nums[i], nums[i] * g[i - 1]);} else {f[i] = max(nums[i], nums[i] * g[i - 1]);g[i] = min(nums[i], nums[i] * f[i - 1]);}}int ret = f[0];for (int i = 1; i < n; i++) {ret = max(ret, f[i]);}return ret;}
};

 

以下是代码的主要步骤:

  • 初始化 f[0] 和 g[0] 为 nums[0],因为第一个元素既是最大乘积也是最小乘积的起点。
  • 遍历数组 nums,从第二个元素开始:
    • 如果当前元素 nums[i] 是正数,则最大乘积 f[i] 可以是 nums[i] 或者 nums[i] * f[i-1](取决于哪个更大),最小乘积 g[i] 可以是 nums[i] 或者 nums[i] * g[i-1](取决于哪个更小)。
    • 如果当前元素 nums[i] 是负数,则最大乘积 f[i] 可以是 nums[i] 或者 nums[i] * g[i-1](因为负数乘以负数变正数,可能成为新的最大乘积),最小乘积 g[i] 可以是 nums[i] 或者 nums[i] * f[i-1](因为负数乘以正数变得更小)。
  • 遍历完成后,f 数组中的最大值即为所求的最大乘积。

http://www.ppmy.cn/ops/105533.html

相关文章

盘点2024年最常用的透明加密软件!TOP10排行榜

随着数字化生活的深入&#xff0c;数据安全成为每个人和企业都不可忽视的重要议题。透明加密软件因其在保障数据安全的同时&#xff0c;不影响用户日常操作的特性&#xff0c;越来越受到人们的青睐。以下是2024年最常用的透明加密软件TOP10排行榜&#xff0c;它们以卓越的性能和…

AtCoder ABC 359 F 题解

本题要看出性质并进行验证&#xff0c;程序难度低。&#xff08;官方 Editorial 似乎没有写证明过程&#xff1f;难道是过于显而易见了吗…&#xff09; 题意 给你一个数组 a a a&#xff0c;对于一棵 n n n 个节点的树 T T T&#xff0c; d i d_i di​ 为每个节点的度&am…

125. 验证回文串

题目 见125. 验证回文串 解题思路 一看到回文子串&#xff0c;就用双指针来做。最开始我是用的最长回文子串的思路来做的。 后面写完发现不对。 最长回文子串是从从中心开始向两端扩散。而本题是求整个字符串是否为回文&#xff0c;如果用中心扩散&#xff0c;就算考虑了奇偶…

Spark框架

简介 带有流处理功能的批处理框架 spark系统架构 SQL RDD&#xff1a;spark中的一种数据结构 streaming MLlib graphX RDD

智慧公厕:城市公共卫生管理的新篇章‌@卓振思众

在快节奏的现代生活中&#xff0c;公共厕所作为城市基础设施的重要组成部分&#xff0c;其使用体验和管理效率直接影响着市民的生活质量与城市形象。随着科技的飞速发展&#xff0c;智慧公厕应运而生&#xff0c;它以一种全新的姿态&#xff0c;为城市公共卫生管理带来了前所未…

“三年级英语”暴增5亿搜索量?需求来了!附2个极品AI吸粉玩法!

家人们&#xff01;在英语细分领域&#xff0c;一直都是付费知识中的风口黄金大赛道。 而这两天“英语”这个关键词&#xff0c;在微信指数上的日搜索量突然猛增到5个亿。 这两天全网热词“三年级英语”&#xff0c;日环比搜索指数更是486.2%增长率&#xff0c;一天时间内就增…

CSS 指南

CSS 指南 1. 引言 CSS(层叠样式表)是一种用于描述HTML或XML文档样式的样式表语言。它允许开发者控制网页的布局、字体、颜色、间距等视觉方面,是网页设计和开发的重要组成部分。本文将提供一份全面的CSS指南,旨在帮助读者理解并掌握CSS的基础知识和高级技巧。 2. CSS基础…

Adobe主要产品及其简介

Adobe 是全球领先的数字媒体和创意软件公司&#xff0c;提供一系列广泛应用于设计、摄影、视频、网络开发等领域的产品。以下是 Adobe 的一些主要产品及其简介和相关资源&#xff1a;【rjqjf.com】 Adobe Photoshop 【rjqjf.com】 世界上最受欢迎的图像编辑软件&#xff0c;用…