leetcode152. 乘积最大子序列
给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-product-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答:
1.一开始的想法是利用一个数组dp,保存最大值,但是数组中有负数,所以无法判断之前的负数可能遇见这个元素就变成最大值了。
2.然后想的是能不能简化暴力法,想到用一个二维dp数组,将nums数组的子序列乘积值保存一下,然后计算后面的值既可以用前面的值了,比如说
1~5,可以是1~4*nums[5],这样不需要重新计算一遍,但是数组空间爆了,倒数第二个案例通过不了。。。。所以这种解法no
3.看解析了,发现别人是在1的基础上再添加一个mindp数组,其实代表一种想法就是,每次遇到的元素就是正数或者负数,然后前面的值可能是正数,负数,所以我们用mindp保存可能遇到的负数最小值,但是max中保存的是最大值,所以只需要拿前一个的最小值,最大值分别乘以nums[i],然后还需要跟nums[i]自己比较谁最大,毕竟,可能这个子序列走到i的时候前面都不理想,那么从i开始不是也是一种子序列的选择吗?
dpmax[i]=max(nums[i],nums[i]*dpmin[i-1],nums[i]*dpmax[i-1]),从三者间取出一个最大值,那么同样的,min就是取出最小值。
1 class Solution {
2 public int maxProduct(int[] nums) {
3 int n=nums.length;
4 int[] dpMax=new int[n];
5 int[] dpMin=new int[n];
6 dpMax[0]=dpMin[0]=nums[0];
7 for(int i=1;i<n;i++)
8 {
9 dpMax[i]=Math.max(dpMax[i-1]*nums[i],Math.max(nums[i],dpMin[i-1]*nums[i]));
10 dpMin[i]=Math.min(dpMax[i-1]*nums[i],Math.min(nums[i],dpMin[i-1]*nums[i]));
11 }
12 int max=dpMax[0];
13 for(int i=1;i<n;i++)
14 max=Math.max(max,dpMax[i]);
15 return max;
16 }
17 }
最新文章
- nginx 命令
- 把excel中的数据导入到数据库
- Java语法基础动手动脑实践
- Mac下配置cocos2dx2.2.6的Android环境
- bnu 4353 删格游戏(博弈)
- HDU4745 - Two Rabbits(区间DP)
- OOA/OOD/OOP(转)
- Unity3D文件读取
- onload=";fixImage(this, 200, 200)";
- [转]Go里面的unsafe包详解
- 复习下CSS-零碎要点
- windows2012 IIS部署GeoTrust证书踩过的坑。 视频测试可用 IIS 证书导入
- ELK之使用heartbeat监控WEB站点
- mybatis(一、原理,一对多,多对一查询)
- 用Java发起HTTP请求与获取状态码(含状态码列表)
- K:栈和队列的比较
- 纯css3实现的竖形二级导航
- 2017年10月29日 数据库查询总结&;45道题
- Java内存区域与内存溢出异常---对象的创建
- Codeforces 852D
热门文章
- 拿了十几个offer,怎样做选择?
- MongoDB分片 --- MongoDB基础用法(六)
- git每次提交代码都要设置账号密码的问题
- Java SPI 机制实现解耦与本地化
- Redis常用命令(5)——Set
- Java学习的第十七天
- twoSum问题的核心思想
- Unity报错:xxx AnimationEvent has no function name specified!
- 读书笔记:《数据结构与算法分析Java语言描述》
- Loading descriptor for XXX.&#39;has encountered a problem&#39; A internal error occured during:";Loading .....";