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

embedded/2024/11/24 0:57:19/

 思路:

首先使用递归来解,从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.ppmy.cn/embedded/34205.html

相关文章

2024年 Java 面试八股文——SpringCloud篇

目录 1.Spring Cloud Alibaba 中的 Nacos 是如何进行服务注册和发现的&#xff1f; 2.Spring Cloud Alibaba Sentinel 的流量控制规则有哪些&#xff1f; 3.Spring Cloud Alibaba 中如何实现分布式配置管理&#xff1f; 4.Spring Cloud Alibaba RocketMQ 的主要特点有哪些&…

基于机器学习的网络流量识别分类

1.cicflowmeter的目录框架&#xff1a; 各部分具体代码 FlowMgr类&#xff1a; package cic.cs.unb.ca.flow;import cic.cs.unb.ca.Sys; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.time.LocalDate;public class FlowMgr {protected static final…

openssl相关命令

报错keytool error: java.lang.Exception: Input not an X.509 certificate 该报错表示需要 X.509 格式的证书,可以通过下面的命令转换 openssl x509 -in <原证书> -out <X.509证书> # 例如 openssl x509 -in test.crt -out test509.crt 参考: Error Importing…

Apache反代理Tomcat项目,分离应用服务器和WEB服务器

项目的原理是使用单独的机器做应用服务器&#xff0c;再用单独的机器做WEB服务器&#xff0c;从网络需要访问我们的应用的话&#xff0c;就会先经过我们的WEB服务器&#xff0c;再到达应用程序&#xff0c;这样子的好处是我们可以保护应用程序的机器位置&#xff0c;同时还可以…

批处理优化

1.4、总结 Key的最佳实践 固定格式&#xff1a;[业务名]:[数据名]:[id]足够简短&#xff1a;不超过44字节不包含特殊字符 Value的最佳实践&#xff1a; 合理的拆分数据&#xff0c;拒绝BigKey选择合适数据结构Hash结构的entry数量不要超过1000设置合理的超时时间 2、批处理优…

贪心算法(活动选择、分数背包问题)

一、贪心算法 贪心算法是指&#xff1a;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择&#xff0c;而不从整体最优考虑&#xff0c;做出的仅是在某种意义上的局部最优解。 …

AEC Capital Limited:开启可持续金融新纪元

在当今社会&#xff0c;环保和可持续发展已成为全球关注的焦点。在这个背景下&#xff0c;AEC Capital Limited作为香港的一家金融服务公司&#xff0c;以其专业、高端的服务和创新的理念&#xff0c;成为可持续金融领域的引领者。我们致力于将环境保护与金融服务相结合&#x…

智慧旅游引领未来风尚,科技助力旅行更精彩:科技的力量推动旅游业创新发展,为旅行者带来更加便捷、高效和智能的旅行服务

目录 一、引言 二、智慧旅游的概念与特点 &#xff08;一&#xff09;智慧旅游的概念 &#xff08;二&#xff09;智慧旅游的特点 三、科技推动旅游业创新发展 &#xff08;一&#xff09;大数据技术的应用 &#xff08;二&#xff09;人工智能技术的应用 &#xff08;…