求连续最大子序列积 - leetcode. 152 Maximum Product Subarray
题目链接:Maximum Product Subarray solutions同步在github
题目很简单,给一个数组,求一个连续的子数组,使得数组元素之积最大。这是求连续最大子序列和的加强版,我们可以先看看求连续最大子序列和的题目maximum-subarray,这题不难,我们举个例子。
假设数组[1, 2, -4, 5, -1, 10]
,前两个相加后得到3,更新最大值(为3),然后再加上-4后,和变成-1了,这时我们发现如果-1去加上5,不如舍弃前面相加的sum,5单独重新开始继续往后相加。没错,维护一个当前的和,小于0后置为0重新开始就可以了:
var maxSubArray = function(nums) {
var maxn = -Infinity;
var sum = 0;
nums.forEach(function(item) {
sum += item;
if (sum > maxn)
maxn = sum;
if (sum < 0)
sum = 0;
});
return maxn;
};
接着回到这道题。连续积的复杂之处在于有正负数,如果全是正数,那就好办了,跟最大和差不多,一直相乘,维护个乘积,如果积小于1了,就置为1,因为一个小于1的正数乘以a肯定小于a。但是,理想是美好的,现实是残酷的,我们有负数,那咋办?在维护最大乘积同时维护一个最小的乘积(负数)。
怎么说?举个例子,求数组[-2, -1, -3, 3]
的最大连续子序列积,当进行到第一项的时候,我们得到了积-2,我们需要保存这个-2,因为如果-2之后能遇到负数,那么负负得正就可能刷新最大积的值。于是我们得维护两个值,一个大于1的当前最大乘积(res),和一个小于0的最小乘积(tmp)。下一次迭代的res可能由前一次的res乘以一个正数得到,也可能由前一个的tmp乘以负数得到,tmp亦然。
代码很简单,但是重要的是思考的过程。
var maxProduct = function(nums) {
var ans = -Infinity
, res = 1
, tmp = 1;
nums.forEach(function(item) {
var _res = res * item
, _tmp = tmp * item;
ans = Math.max(ans, _res, _tmp);
res = Math.max(_res, _tmp, 1);
tmp = Math.min(_res, _tmp, 1);
});
return ans;
};
求连续最大子序列积 - leetcode. 152 Maximum Product Subarray的更多相关文章
- [LeetCode] 152. Maximum Product Subarray 求最大子数组乘积
Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...
- C#解leetcode 152. Maximum Product Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- LeetCode 152. Maximum Product Subarray (最大乘积子数组)
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- Java for LeetCode 152 Maximum Product Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- [leetcode]152. Maximum Product Subarray最大乘积子数组
Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...
- leetcode 152. Maximum Product Subarray --------- java
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- Leetcode#152 Maximum Product Subarray
原题地址 简单动态规划,跟最大子串和类似. 一维状态空间可以经过压缩变成常数空间. 代码: int maxProduct(int A[], int n) { ) ; ]; ]; ]; ; i > ...
- 152. Maximum Product Subarray - LeetCode
Question 152. Maximum Product Subarray Solution 题目大意:求数列中连续子序列的最大连乘积 思路:动态规划实现,现在动态规划理解的还不透,照着公式往上套的 ...
- leetcode 53. Maximum Subarray 、152. Maximum Product Subarray
53. Maximum Subarray 之前的值小于0就不加了.dp[i]表示以i结尾当前的最大和,所以需要用一个变量保存最大值. 动态规划的方法: class Solution { public: ...
随机推荐
- 单例(Singleton)模式
最简单的单例「饿汉式」 public class Singleton{ private static Singleton instance=new Singleton(); //other f ...
- 文件件监听器,android系统拍照功能调用后删除系统生成的照片
先说说要实现的功能: android调用系统拍照功能实时 预览 删除 上传 保存 (用户不能再本地文件夹中看到拍的照片) 再说说遇到的问题: 1.调用系统拍照在系统自带的拍照文件夹中生成一张随机命名图 ...
- vs中不得不会的一些小技巧(1)——细说查找
最近在改公司里面古老的asp代码,不说文件有1w个,起码也有7,8千,而且文件里面include一个嵌套一个...当某天jira平台 上出现了需要你改的bug的时候,甚至都不知道这个错误在哪个页面,更 ...
- MySQL 调优基础(二) Linux内存管理
进程的运行,必须使用内存.下图是Linux中进程中的内存的分布图: 其中最重要的 heap segment 和 stack segment.其它内存段基本是大小固定的.注意stack是向低地址增长的, ...
- Highcharts使用简例 + 异步动态读取数据
第一部分:在head之间加载两个JS库. <script src="html/js/jquery.js"></script> <script src= ...
- Windows环境下载与安装JBOSS服务器的详细图文教程
一.JDK的安装 首先安装JDK,配置环境变量(PATH,CLASSPATH,JAVA_HOME). 可以参照:Windows环境下JDK安装与环境变量配置 二.Jboss的介绍 JBOSS是EJB的 ...
- react native windows开发环境搭建(二)
上一篇中介绍了本地服务器端环境的安装,使用已经编译好的apk程序,设置ip地址,就可以看到welcome界面,并且可以对程序做出修改以及调试. 为了扩展和发布应用 还需要能编译loader程序,这里介 ...
- 烂泥:NFS做存储与KVM集成
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 以前有关NFS的文章,我们介绍的都是NFS的使用挂载等等.这篇文章我们介绍有关NFS作为存储使用. 既然本篇文章的主题是有关NFS的,我们还是先把NFS ...
- android中BuildConfig.DEBUG的使用
ADT(r17)中添加了一个新功能可以允许开发者只在Debug模式下允许某些代码.Build系统生成一个名称为BuildConfig的类,该类包含一个DEBUG 常量,该常量会根据您的Build类型自 ...
- Python 标准异常
异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的 ...