寻找 3 个数的最大乘积
题目描述
实现一个算法在数组中找到 3 个数字的最大乘积。介绍如下:
- 例如数组 [5, -2, 3, 1, -1, 4] 中 3 个数字的最大乘积为 60。
输入描述
第一行为数字 � (3≤�≤1000)N (3≤N≤1000),表示数组元素的个数。
第二行为数组元素 ��Ai,−1000≤��≤1000−1000≤Ai≤1000。
输出描述
输出一行,为 3 个数字的最大乘积。
输入输出样例
示例
输入
6
5 -2 3 1 -1 4
输出
60
解法一:直接暴力for循环
ans必须要设置成大小的负数值,因为当数组是奇数个全是负数时,乘积最大值一定为负数。
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int arr[2005];
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
int ans = -10005;
for (int i = 0; i < n; i++) {
for (int q = i + 1; q < n; q++) {
for (int p = q + 1; p < n; p++) {
ans =(int)fmax(ans, arr[i] * arr[q] * arr[p]);
}
}
}
printf("%d", ans);
return 0;
}
解法二:
整数数组的三数之积
全正数: 1,2,3,4,5 乘积最大值(3*4*5)三个最大值
全负数: -5,-4,-3,-2,-1 -1、-2、-3 三个最大值
正负数: -1,1,2,3,4 2,3,4 三个最大值
正负数:-4,-3,-2,-1,1 -4,-3,1 两最小、一最大
情况 | 数组 | 结果 | 描述 |
---|---|---|---|
全正数 | 1,2,3,4,5 | 3 * 4 * 5 | 三个最大值 |
全负数 | -5,-4,-3,-2,-1 | -3 * -2 * -1 | 三个最大值 |
正负数 | -1,1,2,3,4 | 2 * 3 * 4 | 三个最大值 |
正负数 | -4,-3,-2,-1,1 | -4 * -3 * 1 | 两最大一最小值 |
所以结果为max((max1 * max2 * max3) , (min1 * min2 * max3))
找出数组中的三个最大值和两个最小值即可
#include<iostream>
#include<algorithm>
using namespace std;
int a[2005];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
int ans = max(a[0] * a[1] * a[n - 1], a[n - 1] * a[n - 2] * a[n - 3]);
cout << ans;
return 0;
}