求连续最大子序列积 - 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: ...
随机推荐
- Enabling Cross-Origin Requests in ASP.NET Web API 2
Introduction This tutorial demonstrates CORS support in ASP.NET Web API. We’ll start by creating two ...
- 挖一挖C#中那些我们不常用的东西之系列(4)——GetHashCode,ExpandoObject
这篇继续分享下GetHashCode和ExpandoObject这两个比较好玩的方法. 一:GetHashCode 从MSDN上可以看到的解释是:用作特定类型的哈希函数,也就是说任何对象的实例都会有一 ...
- python入门综合
#!/usr/bin/env python#-*-coding:utf-8-*- #以上是配置编写环境的开始 #第一行env表示运行当前环境变量内的python版本(2.x or 3.x)#第二行 ...
- WPF 程序Form自的控件自适应方式之一
<Window x:Class="MapEditor2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/ ...
- CentOS 6.3下配置软RAID(Software RAID)
一.RAID 简介 RAID 是英文Redundant Array of Independent Disks 的缩写,翻译成中文意思是“独立磁盘冗余阵列”,有时也简称磁盘阵列(Disk Array). ...
- STM32之USART-RS485
转载自:http://www.cnblogs.com/itloverhpu/p/3278014.html 1.今天调试HDMI8X8背板和板卡的通信,一直有问题:背板可以和PC正常通信,背板可以发命令 ...
- 白话debounce和throttle
遇到的问题 在开发过程中会遇到频率很高的事件或者连续的事件,如果不进行性能的优化,就可能会出现页面卡顿的现象,比如: 鼠标事件:mousemove(拖曳)/mouseover(划过)/mouseWhe ...
- [转][MVC] 剖析 NopCommerce 的 Theme 机制
本文转自:http://www.cnblogs.com/coolite/archive/2012/12/28/NopTheme.html?utm_source=tuicool&utm_medi ...
- NET Core中实现一个Token base的身份认证
NET Core中实现一个Token base的身份认证 注:本文提到的代码示例下载地址> How to achieve a bearer token authentication and au ...
- WinCE项目应用之虚拟仪器(VI)
虚拟仪器技术就是利用高性能的模块化硬件,结合高效灵活的软件来完成各种测试.测量和自动化的应用.虚拟测量仪器(VI)概念由美国国家仪器公司NI(National Instruments)提出,并引发了传 ...