题目:
给定一个长度为N的整数数组,只允许用乘法,不允许用除法,计算任意(N-1)个数的组合中
给定一个长度为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;
}