求连续最大子序列积 - 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: ...
随机推荐
- 用java的jdk 生成android 的jni接口文档
1 检查系统是否安装了jdk,并将javac的路径配置到PATH中 cmd窗口,输入 java -version 查看输出项 2 创建需要so的接口类package com.ndk.test; p ...
- Linux hostname对Oracle实例以及监听的影响
在Linux平台中,对hostname的修改,是否对ORACLE数据库实例或监听进程有影响呢?如果有影响,又要如何解决问题呢?另外/etc/hosts下相关内容的修改,是否也会影响实例或监听呢?这里涉 ...
- SQL Server(七)——存储过程
一.概述 存储过程是一组编译在单个执行计划中的T-SQL语句 存储过程:就像函数一样的会保存在数据库中(可编程性) 存储过程的优点: 1.允许模块化程序设计 2.允许更快执行如果某操作需要大量T-SQ ...
- js实现页面跳转的几种方式
第一种: <script language="javascript" type="text/javascript"> wi ...
- ARM指令
语法格式 <opcode>{<cond>}{S} <Rd>, <Rn>,<shifter_operand> {}表示是可选的部分,<& ...
- Linux磁盘管理之设备文件详解04
Linux一切接文件,除了普通文件和目录文件,还包括一些其它的特殊文件:块设备文件.字符设备文件.套接字文件.链接文件等.今天这里主要说一下常见的块设备文件和字符设备文件,这2类是最常见的设备文件类. ...
- Java 集合系列13之 WeakHashMap详细介绍(源码解析)和使用示例
概要 这一章,我们对WeakHashMap进行学习.我们先对WeakHashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用WeakHashMap.第1部分 WeakHashMap介绍 ...
- arc如何破循环或交叉引用
IOS两种常见的循环引用: 1,两个类之间互相定义对方的引用 如下: //ARC code @interface A : NSObject @property (nonatomic,strong) B ...
- 【Linux】Linux 目录结构
博客已转移,请借一步说话 .http://www.weixuehao.com/archives/492 初学Linux,首先需要弄清Linux 标准目录结构 / root --- 启动Linux时使用 ...
- Color国际青年公寓
Color国际青年公寓介绍.md-/Users/zjh/Documents html{font-family: sans-serif;-ms-text-size-adjust: 100%;-webki ...