CodeTop097 乘积最大子数组
乘积最大子数组
给你一个整数数组nums,请你找出数组中乘积最大的非空连续子数组
(该子数组中至少包含一个数字),并返回该子数组所对应的乘积
测试用例的答案是一个32位整数
子数组是数组的连续子序列。
第一反应就是动态规划,然后记录每个位置的最大子数组.不过这样总是有问题
正确的方式是:使用动态规划,但是要同时记录每个位置的最大值和最小值,这是因为
- 如果当前位置是一个正数,那么它希望前面dp[i-1]位置的结果越大越好
- 如果当前位置是一个负数,那么它希望前面dp[i-1]位置的结果越小越好
所以单纯的如果只使用一个动态规划记录最大和的话 每个位置的结果并非是最优的解,当记录下最大和最小时,当前位置的最优一定能够找到
public int maxProduct(int[] nums) {int len = nums.length;int[] minDp = Arrays.copyOf(nums, nums.length);int[] maxDp = Arrays.copyOf(nums, nums.length);int ans = maxDp[0];for (int i = 1; i < len; i++) {maxDp[i] = Math.max(nums[i], Math.max(nums[i] * maxDp[i - 1], nums[i] * minDp[i - 1]));minDp[i] = Math.min(nums[i], Math.min(nums[i] * maxDp[i - 1], nums[i] * minDp[i - 1]));ans = Math.max(ans, maxDp[i]);}return ans;}
还可以进行优化空间复杂度
public int maxProduct2(int[] nums) {int len = nums.length;int minDp = nums[0];int maxDp = nums[0];int ans = nums[0];for (int i = 1; i < len; i++) {int max = maxDp, min = minDp;maxDp = Math.max(nums[i], Math.max(nums[i] * max, nums[i] * min));minDp = Math.min(nums[i], Math.min(nums[i] * max, nums[i] * min));ans = Math.max(ans, maxDp);}return ans;}
CodeTop097 乘积最大子数组相关推荐
- 152. 乘积最大子数组
Title 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积. 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: ...
- 动态规划——乘积最大子数组(Leetcode 152)
题目选自Leetcode 152. 乘积最大子数组 题目描述: 解题思路: 解题代码: class Solution { public:int maxProduct(vector<int> ...
- 最大连续子数组和 动态规划_每日LeetCode,乘积最大子数组
152. 乘积最大子数组leetcode-cn.com 给你一个整数数组nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积. 示例 1: 输入: ...
- 算法-----------乘积最大子数组(Java版本)
题目: 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积.示例 1:输入: [2,3,-2,4] 输出: 6 解释: 子数组 ...
- 乘积最大子数组—leedcode152
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积. 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2 ...
- leetcode152. 乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积. 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2 ...
- [Leedcode][JAVA][第152题][乘积最大子数组][动态规划]
[问题描述][中等] 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积.示例 1:输入: [2,3,-2,4] 输出: 6 解 ...
- Leetcode--152. 乘积最大子数组(java)
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积. 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2 ...
- 152 乘积最大子数组(动态规划)
1. 问题描述: 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积. 示例 1: 输入: [2,3,-2,4] 输出: 6 解 ...
最新文章
- mysql的主从复制功能_Mysql的主从复制功能
- pandas dataframe与series
- 吃完降压药多久能睡觉 降压药什么时候吃好
- MySQL ORDER BY:对查询结果进行排序
- javafx + jfoenix相关学习资料地址整理
- OpenCV的AdaptiveThreshold函数
- “约见”面试官系列之常见面试题第二十四篇之vue-router使用(建议收藏)
- OpenXLSX 字段读取问题
- 最长升序子串1231
- java接口的应用举例
- Nodejs入门[在互联网上非常经常,非常疯狂的一个转载]
- 实战 | Java 流之Stream,Lambda以及日期
- python编写脚本教程_python编写一个会算账的脚本的示例代码
- Mac小技巧:在mac上怎么把png转换成jpg
- winRAR 离购买许可只剩xx天
- 前后端、数据库时间格式化方法
- 3-----A Forcast for Bicycle Rental Demand Based on Random Forests and Multiple Linear Regression
- oracle dul 扫描磁盘,案例:Oracle dul数据挖掘 磁盘损坏dul提取数据文件中表的数据及l...
- python进行Excel处理
- 监控Kafka(kafka_exporter)
热门文章
- Studing Day1 - python基础1
- 空间统计说历史:奥德修斯的归家之路
- windows注册表_改进Windows的20个最佳注册表技巧
- 给Unity开发者的C#内存管理(第一部分) C# Memory Management for Unity Developers (part 1 of 3)
- TestCenter测试管理工具功能详解三(H)
- 惠普笔记本恢复出厂系统
- 中国生物医药项目投资机会及运营前景策略研究报告2021-2027年
- python添加元素到数组开头_python添加元素到数组开头_Python语法总结(纯干货)...
- MLNLP顶会论文发表总榜:谷歌最狂,清北入前十,周明、张岳、刘挺华人前三
- 林业调查规划设计资质申办流程及要求?