求子数组的最大乘积

题目:
给定一个长度为N的整数数组,只允许用乘法,不允许用除法,计算任意(N-1)个数的组合中

乘积最大的一组,并写出算法的时间复杂度


思路:可以理解为从一个数组里去掉某一个数使得数组最大,数组里面有正数,负数,0,可以分为几种情况
      数组里面有0的情况:
 1、如果数组里面有一个0,负数个数是偶数,那么总值必为0,此时去掉0可以达到最大值
 2、如果数组里面有一个0,负数个数是奇数,那么去掉一个负数可以达到最大值,最大值为0
 3、如果数组里面超过一个0,那么无论去掉哪个数,都只能得到0
 数组里面没有0,有负数的情况:
 1、如果负数的个数是偶数,那么去掉最小的一个正数可以达到最大值
 2、如果负数的个数是奇数,那么去掉最大的一个负数可以达到最大值
 数组里面没有0也没有负数的情况:
 去掉一个最小正数即可

#include<iostream>
using namespace std;

void maxRide(int array[], int len)
{
	if (len < 2)
	{
		cout << "请输入大于2的数组";
		return;
	}
	int negativeNum = 0;     //负数个数
	int positiveNum = 0;     //正数个数
	int zeroNum = 0;         //0的个数
	int maxValue = 1;       //最大值
	int maxNegative = -1000;   //最大负数
	int minPositive = 1000;   //最小正数

	//找出0、负数、正数的个数
	for (int i = 0; i < len; i++)
	{
		if (array[i] < 0 && array[i] > maxNegative)
			maxNegative = array[i];
		else if (array[i] > 0 && array[i] < minPositive)
			minPositive = array[i];

		if (array[i] == 0)
			zeroNum++;
		else if (array[i] < 0)
			negativeNum++;
		else
			positiveNum++;
	}
	cout << zeroNum << endl;
	cout << negativeNum << endl;
	cout << positiveNum << endl;
	cout << "最小正数  " << minPositive << endl;
	cout << "最大负数" << maxNegative << endl;
	//有0的情况
	if (zeroNum != 0)
	{
		//如果只有一个0
		if (zeroNum == 1)
		{
			//如果负数个数是偶数,则去掉0则是最大值,如果是奇数,则最大值为0
			if (negativeNum % 2 == 0)
			{
				for (int i = 0; i < len; i++)
				{
					if (array[i] == 0)
						;
					else
						maxValue *= array[i];
				}
				cout << "最大乘积为 " << maxValue << endl;
			}
			else
				cout << "最大乘积为0" << endl;
		}
		//如果0的个数超过一个,则最大值为0
		if (zeroNum > 1)
			cout << "最大值为0" << endl;
	}
		//如果没有0,且有负数
		if (zeroNum == 0 && negativeNum != 0)
		{
			//如果负数个数是偶数,则去掉一个最小值正数
			if (negativeNum % 2 == 0)
			{
				for (int i = 0; i < len; i++)
				{
					if (array[i] == minPositive)
						;
					else
						maxValue *= array[i];
				}
				cout << "子数组最大值为  " << maxValue << endl;
			}
			//如果负数个数是奇数,则去掉一个最大负数
			else
			{
				for (int i = 0; i < len; i++)
				{
					if (array[i] == maxNegative)
						;
					else
						maxValue *= array[i];
				}
				cout << "子数组最大值为  " << maxValue << endl;
			}
		}
		//没有0,也没有负数的情况
		if (zeroNum == 0 && negativeNum == 0)
		{
			for (int i = 0; i < len; i++)
			{
				if (array[i] == minPositive)
			 		;
				else
					maxValue *= array[i];
			}
			cout << "子数组最大值为  " << maxValue << endl;
		}
     
}
int main()
{
	const int NUM = 10;       //允许输入10个数
	int *array = new int[NUM];  //创建10个变量的数组
	//输入
	int num;
	for (int i = 0; i < NUM; i++)
	{
		cin >> num;
		array[i] = num;
	}
	int len = sizeof(array) / sizeof(int);
	maxRide(array, NUM);
	system("pause");
	return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值