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

ops/2024/10/18 7:46:25/

 思路:

首先使用递归来解,从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/ops/37987.html

相关文章

3.处理数据

处理数据 写在前面1.变量整型char类型bool类型浮点型类型分类 2.算术运算符除模 3.类型转换总结 写在前面 关于看书。其实我已经很久没看过书了&#xff0c;最近一次长时间看书还要追述到大学的时候&#xff0c;那时候上面都没有&#xff0c;就是有时间。原本我其实很爱看书的…

深度学习常用优化算法笔记介绍,各种梯度下降法详细介绍

优化算法 mini-batch梯度下降法 当一个数据集其数据量非常大的时候&#xff0c;比如上百万上千万的数据集&#xff0c;如果采用普通的梯度下降法&#xff0c;那么运算速度会非常慢&#xff0c;因为如果使用梯度下降法在每一次迭代的时候&#xff0c;都需要将这整个上百万的数…

【快速入门Linux】10_Linux命令—Vi编辑器

文章目录 一、vi 简介1.1 vi1.2 vim1.3查询软连接命令&#xff08;知道&#xff09; 二、打开和新建文件&#xff08;重点&#xff09;2.1 打开文件并且定位行2.2 异常处理 三、vi三种工作模式&#xff08;重点&#xff09;3.1 末行模式-命令 四、常用命令4.0 命令线路图4.1 移…

json文件的读取

📚博客主页:knighthood2001 ✨公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下) 🎃知识星球:【认知up吧|成长|副业】介绍 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏笔者水平有限,欢迎各位大佬指点,相…

特化标准库中的类模板

以std::map和std::less作为载体说明如何特化标准库中的类模板。 std::map容器允许提供一个自定义的比较器。默认行为是让std::map使用一个模板类std::less<>&#xff0c;使用<运算符来比较键。如果想存储一个不能使用<进行比较的类型&#xff0c;可以为此类型特化…

【6D位姿估计】数据集汇总 BOP

前言 BOP是6D位姿估计基准&#xff0c;汇总整理了多个数据集&#xff0c;还举行挑战赛&#xff0c;相关报告被CVPR2024接受和认可。 它提供3D物体模型和RGB-D图像&#xff0c;其中标注信息包括6D位姿、2D边界框和2D蒙版等。 包含数据集&#xff1a;LM 、LM-O 、T-LESS 、IT…

【web网页制作】html+css旅游家乡河南开封主题网页制作(4页面)【附源码】

HTMLCSS家乡河南主题网页目录 &#x1f354;涉及知识&#x1f964;写在前面&#x1f367;一、网页主题&#x1f333;二、页面效果Page1 首页Page2 开封游玩Page 3 开封美食Page4 留言 &#x1f308; 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 &#x1f40b;四…

通过AOP实现项目中业务服务降级功能

最近项目中需要增强系统的可靠性&#xff0c;比如某远程服务宕机或者网络抖动引起服务不可用&#xff0c;需要从本地或者其它地方获取业务数据&#xff0c;保证业务的连续稳定性等等。这里简单记录下业务实现&#xff0c;主要我们项目中调用远程接口失败时&#xff0c;需要从本…