Lc.152 乘积最大子数组

news/2024/11/7 21:42:03/

题目链接

1 前言

翻译成大白话:就是找一个数组,其连续子数组的乘积最大值。

2 算法思路:

一般求最值的问题首选动态规划。

这道题与[LC.53 最大子序和]很类似。我们假设状态转移方程为:

它表示以第 i 个元素结尾乘积最大子数组的乘积

可是在这里,这样做是错误的。为什么呢?

因为这里的定义并不满足「最优子结构」。具体地讲,如果 a = {5, 6, −3, 4, −3},那么此时 f(i)对应的序列是 {5,30,-3,4,-3},按照前面的算法我们可以得到答案为 30,即前两个数的乘积,而实际上答案应该是全体数字的乘积。我们来想一想问题出在哪里呢?问题出在最后一个 -3。所以我们得到了一个结论:当前位置的最优解未必是由前一个位置的最优解转移得到的。

我们可以根据正负性进行分类讨论。

由于负数存在的原因,我们可根据负数分类,使用来个动态数组。

中记录的是以第 i 个元素结尾乘积最大子数组的乘积。

中记录的是以第 i 个元素结尾乘积最小子数组的乘积。

3 具体代码

package cn.msf.hot100;/*** @author : msf* @date : 2023/1/3* lc.152:乘积最大子数组:应该是用动态规划*/
public class MaxProduct {public static void main(String[] args) {int[] nums = {2, 3, -2, 4};int res = new MaxProduct().maxProduct(nums);}public int maxProduct(int[] nums) {int n = nums.length;// 定义dp[i]:从nums[...i]为止,乘积最小的子数组。int[] dp = new int[n];// 定义dp[i]:从nums[...i]为止,乘积最大的子数组。int[] dp1 = new int[n];// base casedp[0] = nums[0];dp1[0] = nums[0];for (int i = 1; i < n; i++) {// 在不考虑0的前提下,如果考虑0 则需要将nums[i]考虑// 如果有nums[i]<0,那么dp1[i-1] * 负值 = dp[i].dp[i] = min(dp[i - 1] * nums[i], dp1[i - 1] * nums[i], nums[i]);// 如果是正值,那么dp1[i-1] * 正值最大。 如果是负值,那么dp[i-1] * 负值肯定是最大。dp1[i] = max(dp[i - 1] * nums[i], dp1[i - 1] * nums[i], nums[i]);}// 遍历所有子数组的最大乘积,求最大值int res = Integer.MIN_VALUE;for (int i = 0; i < n; i++) {res = Math.max(res, dp1[i]);}return res;}int min(int a, int b, int c) {return Math.min(Math.min(a, b), c);}int max(int a, int b, int c) {return Math.max(Math.max(a, b), c);}
}


http://www.ppmy.cn/news/9073.html

相关文章

Spring是怎么回事?新手入门就看这篇吧

前言 今天壹哥给大家介绍一套开源的轻量级框架&#xff0c;它就是Spring。在给大家详细讲解Spring框架之前&#xff0c;壹哥先给大家介绍Spring框架的主要内容&#xff1a; Spring的基本概念 Spring核心思想之ioc Spring核心思想之aop Spring框架对事务的支持 在本系列文章…

哪吒S亮相广州车展,定位B级燃油车颠覆者

2022年收官&#xff0c;哪吒汽车宣布全年交付152073台&#xff0c;其中&#xff1a; •哪吒U 51021台&#xff1b; •哪吒V 98847台&#xff1b; •哪吒S 2003台&#xff08;12月首月交付&#xff09;。与此同时&#xff0c;在年末的广州车展&#xff0c;哪吒汽车携全系车型参展…

视觉slam中的相机类型

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 顾名思义&#xff0c;视觉 SLAM&#xff08;又称 vSLAM&#xff09;使用从相机和其他图像传感器采集的图像。视觉 SLAM 可以使用普通相机&#xff08;广角…

【小程序】包与数据共享

文章目录使用 npm 包Vant WeappAPI Promise化全局事件共享MobX分包分包概念使用分包独立分包分包预下载使用 npm 包 目前&#xff0c;小程序中已经支持使用 npm 安装第三方包&#xff0c;从而来提高小程序的开发效率。但是&#xff0c;在小程序中使用npm 包有如下 3 个限制&am…

人工智能期末——第三章确定性推理考前预测

第三章 推理的定义&#xff1f; 根据知识库中的知识&#xff0c;按照某种策略从已知事实出发推出结论的过程 初始证据是什么&#xff1f; 推理前用户提供的信息 中间证据是什么&#xff1f; 推理过程中得到的信息 按照推理的逻辑基础分类&#xff1f; 演绎推理、归纳推…

RHCSE第一天(Linux的例行性工作)

文章目录Linux搭建服务器的准备工作第一章 Linux的例行性工作1.1 单一执行的例行性工作at1.1.1 at命令的实际工作过程1.1.2 at命令详解1.2 循环执行的例行性工作1.2.1 crontab命令的实际工作过程1.2.2 crontab命令详解1.3 实验实验一&#xff1a;定义三分钟之后显示hello实验二…

强化学习的Sarsa与Q-Learning的Cliff-Walking对比实验

强化学习的Sarsa与Q-Learning的Cliff-Walking对比实验Cliff-Walking问题的描述Sarsa和Q-Learning算法对比代码分享需要改进的地方引用和写在最后Cliff-Walking问题的描述 悬崖行走&#xff1a;从S走到G&#xff0c;其中灰色部分是悬崖不可到达&#xff0c;求可行方案 建模中&am…

【代码题】五道链表面试题

目录 1.移除链表元素 2.反转链表 3.链表的中间结点 4.链表中倒数第k个结点 5.合并两个有序链表 1.移除链表元素 点击进入该题 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回新的头节点 。 思路&am…