编程之美-2.13 子数组最大乘积

问题描述:给定一个长度为N的数组,只允许用乘法,不允许用除法,计算任意N-1个数的组合乘积中的最大的一组,并写出算法时间复杂度。

按照编程之美一书中所描述的解法1,时间复杂度O(N)。

基本原理:第i个元素被排除在乘积之外,则其他N-1个元素之积 subProductI [ i ]=preI[i] *postI[i]; preI[i] 为第1-(i-1)个元素之积,postI[i]为第(i+1)-N个元素之积。

preI, postI都是通过从前向后以及从后向前依次扫描得到的数组。preI[i] = preI[i - 1] * v[i - 1]; postI[i] = postI[i + 1] * v[i+ 1]; v为原始输入数组。

代码如下:

#include 
#include 

using namespace std;
int findMaxProdSubArray(vectorv)
{
	int len = v.size();
	if (len<=1)
		return -1;
	vectorpreI(len);
	vectorpostI(len);
	vectorsubProductI(len);
	preI[0] = 1;
	for (int i = 1; i < len; i++)
		preI[i] = preI[i - 1] * v[i - 1];
	postI[len-1] = 1;
	for (int i = len-2; i >=0; i--)
		postI[i] = postI[i + 1] * v[i+ 1];
	for (int i = 0; i 


你可能感兴趣的:(编程之美)