题目:给定一个整形数组,在数组中找出由三个数组成的最大乘积。
示例1:
输入:{1,2,3}
输出: 6
示例2:{1,2,3,4}
输出: 24
**
思路:先给数组排序,最大的数分为两种情况,一种是全为正数和全为负数,排序后最大的三个数相乘即为结果;另一种是有正有负,取两位最小的负数和最大
的正数相乘的结果和最大的三个数相乘的结果比较,大的即为结果**
C代码:
#include<stdio.h>
#define N 4
int main()
{
int i,j;
int result=1,result1,result2;
int Array[N];
for(i=0;i<N;i++)
{
scanf("%d",&Array[i]);
}
if(N<=3)
{
for(i=0;i<N;i++)
{
result*=Array[i];
}
}
else
{
for(i=0;i<N-1;i++)
{
for(j=0;j<N-i-1;j++)
{
if(Array[j] < Array[j+1])
{
int temp=Array[j+1];
Array[j+1]=Array[j];
Array[j]=temp;
}
}
}
result1=Array[0]*Array[1]*Array[2];
result2=Array[N-1]*Array[N-2]*Array[0];
if(result1>=result2)
result=result1;
else
result=result2;
}
printf("%d",result);
return 0;
}
结果示例:
输入:-1 -3 7 -9
输出:189
输入:1 3 -2 -3
输出:18
Java代码(网上找的):
public class 三个数的最大乘积 {
public static int 三个数的最大乘积(int[] nums) {
int max1 = Integer.MIN_VALUE;
int max2 = Integer.MIN_VALUE;
int max3 = Integer.MIN_VALUE;
int min1 = Integer.MAX_VALUE;
int min2 = Integer.MAX_VALUE;
int len = nums.length;
for (int i = 0; i < len; i++) {
if (nums[i] > max1) {
max3 = max2;
max2 = max1;
max1 = nums[i];
} else if (nums[i] > max2) {
max3 = max2;
max2 = nums[i];
} else if (nums[i] > max3) {
max3 = nums[i];
}
if (nums[i] < min1) {
min2 = min1;
min1 = nums[i];
} else if (nums[i] < min2) {
min2 = nums[i];
}
}
int max = max1 * max2 * max3;
int min = max1 * min1 * min2;
return max > min ? max : min;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int a[] = new int[N];
for (int i = 0; i < N; i++)
a[i] = sc.nextInt();
System.out.println(三个数的最大乘积(a));
}
}
知识点:数组,数学
本结果的缺点是冒泡排序的时间复杂度比较高,亦可以采用其它的排序方法。