2.13 子数组的最大乘积

题目:

给定一个长度为N的整形数组,只允许用乘法,不能用除法。计算任意N-1个数的组合中乘积最大的一组。

方法一:

#include <iostream>

#define MAXN 10000

using namespace std;

int n, a[MAXN], s[MAXN], t[MAXN], p[MAXN];

//s[i]表示数组前i个元素的乘积
//t[i]表示数组后N-i个元素的乘积
//p[i] = s[i-1] * t[i+1];
//p[i]表示数组除第I个元素外,其他N-1个元素的乘积
//s[i]=A[0]*A[1]*…A[i], t[i]=A[i]*A[i+1]*…A[N-1]
//则p[i] = s[i-1] * t[i+1]。

int main() {
	cin >> n;
	for(int i = 0; i < n; ++i) cin >> a[i];
	int sv = 1, tv = 1;
	for(int i = 0; i < n; ++i) {
		int j = n-i-1;
		sv *= a[i];
		tv *= a[j];
		s[i] = sv;
		t[j] = tv;
	}
	int maxNum = p[0] = t[1];    //p[0]和t[1]表示除了最前面那个元素,剩下的N-1个元素相乘的值。
	for(int i = 1; i < n; ++i) {
		p[i] = s[i-1] * t[i+1];
		maxNum = maxNum < p[i] ? p[i] : maxNum;
	}
	cout << maxNum << endl;
	return 0;
}

方法二:

思路:

子数组最大乘积问题可以分为以下几种情况。

1.数组中有多于一个零则最大乘积为0;

2.数组中只有一个零,而有奇数个负数,则最大乘积必定为0;

3.数组中只有一个零,而有偶数个负数,则最大乘积为除去0的元素的乘积;

4.数组中没有零,而有奇数个负数,则最大乘积为除去绝对值最小的负数的乘积;

5.数组中没有零,而有偶数个负数,则最大乘积为除去最小的正数的乘积。

所以求出数组中正数的个数,负数的个数,以及0的个数!这样就是最简单的方法了!

时间: 2024-10-21 18:57:55

2.13 子数组的最大乘积的相关文章

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

      这道题目是求 n-1 个数的最大乘积,即数组大小为 n,则会存在 n 个 n-1 的连续数字,那么,我们需要寻找的是最大的那一个乘积.       其实看到题目,感觉很简单,循环走两遍数组就可以得到结果,但是,那样的话,复杂度是平方量级的,如果一个数组中元素很多,那么,时间效率上是不能接受的,所以,需要重新思考问题,寻找简洁的解法.       这里,我们可以利用辅助数组的办法,把需要乘在一起的数字保存下来,单独的放到数组中,然后乘在一块就可以了,这样说起来其实不是那么容易理解,我还

【编程之美】2.13 子数组的最大乘积

题目:一个有N个数的整数数组 取其中N-1个元素的子数组 求子数组的最大乘积 不能用除法. 这道题自己没有写对,没有考虑到负数的情况,只是单纯的想去掉最小的数. 但是若有负数 -5 -4 -3 中-5 * -4 = 20更大. 需要先统计正数.负数和0的个数,再分类讨论.考察的其实就是细心和耐心. //答案解法 int getMaxProductAnswer(int * a, int alen) { int NumPositive = 0; int NumNegtive = 0; int Num

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

给定义个长度为N的整数数组,只允许用乘法,不能用除法,计算在任意(N-1)的个数的组合中乘积最大的一组. [思路] 突然变成了雅黑,挺不习惯的~~还是雅黑好看?ω? 实现起来很简单,但我是不会想到这样的思路的……看来除了积累别想着有别的途径来提高了π__π 1.用空间换时间,开数组s和t,分别保存从前向后的连乘结果和从后向前的连乘结果.对于每个排除了第i个元素的N-1个元素组合p[i], 有p[i]=s[i-1]*t[i+1],求得所有的p[i],遍历一次即可得最大值. 2.假设N个整数的乘积为

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

问题描述: 给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度. 解法: 1.暴力解法------O(n^2) 2.前后缀法------O(n) 3.统计法--------O(n) 具体思路和代码: 1.暴力解法: 思路:利用两层循环,依次删掉一个,其余的做乘法,计算出最大的. 代码: 1 int s1(int A[], int n) 2 { 3 int s = 1; 4 int max; 5 for(int i = 1;

子数组的最大乘积

这个题目的意思是在一个含有N个数字的数组中,找出N-1个数字,使得这N-1个数字的乘积最大,不允许使用除法. 一开始看这个题的感觉可能是很简单,我只要找出这个数中最小的值,那么剩余的N-1个数的乘积一定是最大的. 但是这就忽略了一个情况,就是存在负数的情况.题目中并没有说是个正数的数组.因此在拿到一道题目时,一定要尽可能的想清楚题目的各个方面. 但是我们依然可以利用上面的这个思路进行查找.首先遍历一遍数组,记录负值绝对值最大和最小的点,0的个数,正数的个数和负数的个数.完成遍历之后,就可以根据以

[经典面试题]子数组的最大乘积

题目 给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合乘积中的最大的一组,并写出算法的时间复杂度. 思路一 穷举法 我们把所有可能的(N-1)个数的组合找出来,分别计算它们的乘积,并比较大小.由于总共有N个(N-1)个数的组合,总的时间复杂度为O(N^2),但显然这不是最好的思路. 思路二 空间换时间 计算(N-1)个数的组合乘积,假设第i个(0<=i<=N-1)元素被排除在乘积之外(如下图). 设num[]为初试数组 Left[i]表示前i个元素(包括第i个

【LeetCode】Maximum Product Subarray 求连续子数组使其乘积最大

Add Date 2014-09-23 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 = 

在一个数组中找到连续的子数组最大的乘积

原题目:https://oj.leetcode.com/problems/maximum-product-subarray/ 例如输入[2,3,-2,4]? 符合条件的子数组应该是[2,3],他们的乘积是6 /** * @Author jiangfq * */ package com.test; /** * @author jiangfq * */ public class Solution { /** * @Author jiangfq * */ public static void main

【编程之美】子数组的最大乘积

给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合中乘积最大的一组,并写出算法的时间复杂度. 我们把所有可能的(N-1)个数的组合找出来,分别计算它们的乘积,并比较大小.由于总共有N个(N-1)个数的组合,总的时间复杂度为O(N2),显然这不是最好的解法. 分析与解法 解法一:空间换时间 用s[i]表示数组的前i个元素的乘积,即s[i]=a[0]*a[1]*...*a[i-1]=s[i-1]*a[i-1],边界s[0]=1: 用t[i]表示数组的后N-i个元素的乘