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

 思路:

首先使用递归来解,从0开始到N,每次都从index开始到N的求出最大值。然后再次递归index+1到N的最大值,再求max。代码如下:

  // 方法一:使用递归方式找出最大乘积public static int maxProduct(int[] nums) {// 检查输入的数组是否为空if (nums == null || nums.length == 0) {return 0;}int N = nums.length;// 从数组的第一个元素开始递归处理return process(nums, 0, N);}// 辅助递归函数private static int process(int[] nums, int index, int N) {// 递归的终止条件:当处理到数组的最后一个元素时,返回该元素if (index == N - 1) {return nums[index];}int max = nums[index]; // 当前位置的最大乘积初始化为当前元素int cur = nums[index]; // 当前乘积// 计算从index开始所有可能的子数组乘积for (int i = index + 1; i < N; i++) {cur = cur * nums[i];max = Math.max(max, cur);}// 返回当前计算的最大值与递归调用下一个元素的结果的最大值return Math.max(max, process(nums, index + 1, N));}

第二种方法:

使用动态规划

public static int maxProduct(int[] nums) {// 检查输入数组是否为空if (nums == null || nums.length == 0) {return 0;}int N = nums.length;int[] dp = new int[N + 1]; // 创建DP数组dp[N] = Integer.MIN_VALUE; // 初始化边界条件dp[N - 1] = nums[N - 1]; // 最后一个元素的最大乘积是其自身// 从后向前遍历数组for (int index = N - 1; index >= 0; index--) {int cur = nums[index];dp[index] = Math.max(cur, dp[index + 1]);for (int i = index + 1; i < N; i++) {cur = cur * nums[i];dp[index] = Math.max(dp[index], cur);}}return dp[0]; // 返回整个数组的最大子数组乘积}

第三种方法 一次for循环,代码如下:

// 方法三:优化的动态规划解法(一次遍历)public static int maxProduct(int[] nums) {// 检查数组是否为空if (nums == null || nums.length == 0) {return 0;}int max = nums[0], min = nums[0], result = nums[0]; // 初始化最大值、最小值和结果// 遍历数组元素for (int i = 1; i < nums.length; i++) {// 如果当前数是负数,交换最大值和最小值if (nums[i] < 0) {int temp = max;max = min;min = temp;}// 更新到当前位置的最大值和最小值max = Math.max(nums[i], max * nums[i]);min = Math.min(nums[i], min * nums[i]);// 更新全局最大乘积结果result = Math.max(result, max);}return result; // 返回结果}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/670022.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

申请Sectigo证书流程详解

Sectigo&#xff08;前身为Comodo CA&#xff09;&#xff0c;是目前主流SSL证书的一种&#xff0c;目前全球范围内应用度也非常广泛&#xff0c;是目前众多品牌中市场份额最大的一个品牌了&#xff0c;在全球证书市场份额占比约为40%。 其超高的市场份额占比主要还是基于其超…

vue cli 自定义项目架子,vue自定义项目架子,超详细

脚手架Vue CLI基本介绍&#xff1a; Vue CLI 是Vue官方提供的一个全局命令工具 可以帮助我们快速创建一个开发Vue项目的标准化基础架子【集成了webpack配置】 脚手架优点&#xff1a; 开箱即用&#xff0c;零配置内置babel等工具标准化的webpack配置 脚手架 VueCLI相关命令…

Autodesk AutoCAD 2025 for Mac:强大的二维三维绘图工具

Autodesk AutoCAD 2025 for Mac是一款专为Mac用户打造的计算机辅助设计软件&#xff0c;它在继承了AutoCAD系列软件的优秀传统的基础上&#xff0c;针对Mac系统进行了全面优化&#xff0c;为用户提供了更出色的绘图和设计体验。 这款软件不仅支持用户创建和编辑复杂的二维几何图…

独家原创 | BiTCN-BiGRU-CrossAttention融合时空特征的高创新预测模型

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…

【设计模式】创建者模式之 工厂方法 抽象工厂

工厂方法模式(Factory Method) 一个特定功能&#xff0c;往往有多种实现方式&#xff0c;但是很难有某一个实现可以适用于所有情况&#xff0c;因此往往需要根据特定的场景选择不同的实现。试想&#xff1a;把选择具体实现的代码放在业务中会发生什么&#xff1f;每当我们需要…

09 华三 SSH

03 华三SSH 远程登录 1 AI解说官网 Kimi.ai - 帮你看更大的世界 (moonshot.cn) 华三交换机的SSH配置主要目的是通过SSH协议实现安全的远程登录和管理&#xff0c;以确保数据传输的安全性。以下是配置SSH的一般步骤和思路&#xff1a; 生成密钥对&#xff1a;首先需要在交换…

Sharding Capital: 为什么投资全链流动性基础设施 Entangle ?

写在前面&#xff1a;Entangle 项目的名称取自于量子纠缠(Quantum entanglement)&#xff0c;体现了项目对于构建连接、关联和互通的愿景。就像量子纠缠将不同的粒子联系在一起&#xff0c;Entangle 旨在通过其跨链流动性和合成衍生品的解决方案将不同的区块链网络连接在一起&a…

[开发|鸿蒙] 鸿蒙OS开发环境搭建(笔记,持续更新)

搭建开发环境流程&#xff1a; https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/installation_process-0000001071425528-V2 鸿蒙DevEco Studio 3.1.1 Release仅支持windows和mac系统 运行环境要求 为保证DevEco Studio正常运行&#xff0c;建议电脑配置…

炒股自动化:散户如何通过API查询资产和持仓,Python接口

券商官方的接口&#xff0c;个人账户可申请&#xff0c;入金门槛低&#xff0c;接入文档完善&#xff0c;技术支持好的&#xff0c;经过我们筛选后&#xff0c;只有一家符合&#xff0c;会编程&#xff0c;有基础&#xff0c;只是需要API接口的朋友不用看这些内容&#xff0c;不…

SpringBoot自动连接数据库的解决方案

在一次学习设计模式的时候&#xff0c;沿用一个旧的boot项目&#xff0c;想着简单&#xff0c;就把数据库给关掉了&#xff0c;结果报错 Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. 没有数据库的需…

【Unity 协程】

Unity中的协程&#xff08;Coroutine&#xff09;是一种编程结构&#xff0c;它允许你以一种看似同步的方式编写可能需要异步执行的代码。协程特别适用于需要在一定时间后执行操作&#xff0c;或者在循环执行某段代码直到某个条件满足时的场景。 协程使用IEnumerator委托来实现…

1-38 流资源类结构

一 简介 1. Java中所说的流资源--IO流 2.为什么学习留资源&#xff1f; --要操作文件中的数据 将数据写入指定的文件 将数据从指定的文件读取 3.分类 -- 四大基流 , 八大子流 (重点) 按照流向分 : 输入流 和输出流 按照操作数据资源的类型划分 字符流 (重点) Reader -- 字符…