Maximum Product Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4],the contiguous subarray [2,3] has the largest product = 6.
看到这道题,很明显的一套动态规划类型的题目,和最长升序子序列之类的十分类似,那么首先就是想递推公式。
思路①:
subarray[i][j]表示数组中从第 i 到第 j 位置的数字组成的子数组的乘积。因此我们有如下递推公式:
subarray[i][j] = subarray[i][j-1] * array[j]
很显然,这种做法需要一个二重循环,时间复杂度是O(n^2)
思路②:
因为考虑到,最大的一个子数组最大乘积可以分为两种情况:
A.之前的子数组乘积为负,当前的数字也为负,相乘为一个大正数
B.之前的子数组乘积为正,当前的数字也是正,相乘为一个正数
考虑到上面的两种情况,因此我们需要保存两个数组,分别记录当前的最大正整数乘积和最小负整数乘积
positive_subarray[i]:表示数组前i个数之前的最大相乘正值(包括第 i 个数)
negative_subarray[i]:表示数组前i个数之前的最大相乘负值(包括第 i 个数)
所以有:
当array[i] >= 0 时:
positive_subarray[i] = max( positive_subarray[i-1]*array[i], array[i] )
negative_subarray[i] = negative_subarray[i-1]*array[i]
当array[i] < 0 时:
positive_subarray[i] = negative_subarray[i-1]*array[i]
negative_subarray[i] = min( positive_subarray[i-1]*array[i], array[i])
这样程序的复杂度就降低到了O(n)
代码如下:
int maxProduct(vector& nums)
{
if(nums.empty())
return 0;
vector positive_subarray = vector(nums.size(),0);
vector negative_subarray = vector(nums.size(),0);
int max_product;
int len = nums.size();
if(nums[0] < 0)
negative_subarray[0] = nums[0];
else
positive_subarray[0] = nums[0];
max_product = nums[0];
for(int i=1;i
{
if(nums[i]>=0)
{
positive_subarray[i] = max(positive_subarray[i-1]*nums[i],nums[i]);
negative_subarray[i] = negative_subarray[i-1]*nums[i];
}
else
{
positive_subarray[i] = negative_subarray[i-1]*nums[i];
negative_subarray[i] = min(positive_subarray[i-1]*nums[i],nums[i]);
}
if(positive_subarray[i]>max_product)
max_product = positive_subarray[i];
}
return max_product;
}
Maximum Product Subarray的更多相关文章
- 求连续最大子序列积 - leetcode. 152 Maximum Product Subarray
题目链接:Maximum Product Subarray solutions同步在github 题目很简单,给一个数组,求一个连续的子数组,使得数组元素之积最大.这是求连续最大子序列和的加强版,我们 ...
- LeetCode: Maximum Product Subarray && Maximum Subarray &子序列相关
Maximum Product Subarray Title: Find the contiguous subarray within an array (containing at least on ...
- LeetCode Maximum Product Subarray(枚举)
LeetCode Maximum Product Subarray Description Given a sequence of integers S = {S1, S2, . . . , Sn}, ...
- LeetCode_Maximum Subarray | Maximum Product Subarray
Maximum Subarray 一.题目描写叙述 就是求一个数组的最大子序列 二.思路及代码 首先我们想到暴力破解 public class Solution { public int maxSub ...
- 【LeetCode】Maximum Product Subarray 求连续子数组使其乘积最大
Add Date 2014-09-23 Maximum Product Subarray Find the contiguous subarray within an array (containin ...
- leetcode 53. Maximum Subarray 、152. Maximum Product Subarray
53. Maximum Subarray 之前的值小于0就不加了.dp[i]表示以i结尾当前的最大和,所以需要用一个变量保存最大值. 动态规划的方法: class Solution { public: ...
- 【刷题-LeetCode】152 Maximum Product Subarray
Maximum Product Subarray Given an integer array nums, find the contiguous subarray within an array ( ...
- 152. Maximum Product Subarray - LeetCode
Question 152. Maximum Product Subarray Solution 题目大意:求数列中连续子序列的最大连乘积 思路:动态规划实现,现在动态规划理解的还不透,照着公式往上套的 ...
- [LeetCode] Maximum Product Subarray 求最大子数组乘积
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- [LeetCode]152. Maximum Product Subarray
This a task that asks u to compute the maximum product from a continue subarray. However, you need t ...
随机推荐
- 软件测试基础homework2
1.for循环里的i>0应该改为i>=0 test1:x=[3,2,5];y=2 test2:x=[3];y=2 test3:x=[2,3,5];y=4 2.for循环里的i应该倒序 te ...
- angular service provider
关于 angular service factory provider 方面有很多,我也来写一篇加深下印象 provider 是一切方法的基础,所以功能也最强,provider 用来定义一个可以被 ...
- Stack的c实现
用c语言实现stack的初始化,push,pop和Clear操作 #include<stdio.h> #include<stdlib.h> #include<assert ...
- Android开发环境配置
由于公司项目需要,最近转做Android开发,这里我来介绍一下Android开发环境的配置过程. 首先,需要下载所需要的软件工具,如下所示: 1.Java:开发基础环境,JDK和JRE这两个都要下载的 ...
- C#面试(2016年4月)
1.WebForm和MVC的区别 MVC: 1)通过model.view.controller将处理后台逻辑代码与前台展示逻辑代码进行了很好的分离: 2)通过修改路由规则,可以控制生成自定义的url, ...
- tomcat底层原理实现
1.首先完成一个server类,用来接收客户端的请求:代码都在一个while(true)循环中,模拟tomcat一直在启动,其中绑定一个端口,用来监听一个端口,然后创建一个输入流,获取请求的输入流,然 ...
- Runtime实战之定制TabBarItem大小
方案一:UIEdgeInsets 适用场景: 适合APP的TabBarItemImage的图片资源放在本地 图片超出tabbar的高度,需移动其位置,来进行适应 弊端: 若在本地配置好后,tabbar ...
- 基于spring的aop实现读写分离与事务配置
项目开发中经常会遇到读写分离等多数据源配置的需求,在Java项目中可以通过Spring AOP来实现多数据源的切换. 一.Spring事务开启流程 Spring中通常通过@Transactional来 ...
- C# Word生成PDF
//Word转换成pdf /// <summary> /// 把Word文件转换成为PDF格式文件 /// </summary> /// <param name=&quo ...
- create a inatll package
gcc -o hell t.c tar -jxf hell.tar.bz2 [root@localhost ~]# cat install.sh #!/bin/bashlines=7tail -n ...