试题描述:
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
解题思路:
要想乘积最大,只有两种情况,一是最大的三个数相乘,二是最大的数和最小的两个数相乘。因此先对数组中的元素进行排序,然后再计算这两种情况的乘积进行比较,返回最大值。
//代码如下
#include <stdio.h>
#include <math.h>
long long maxmulti(long *p, int n)
{
int i = 0, j=0;
//int max1, max2;
int tmp = 0;
//max1 = p[0];
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(p[j]<p[j+1])
{
tmp = p[j];
p[j] = p[j+1];
p[j+1] = tmp;
}
}
}
long long maxmulti1 = p[0] * p[1] * p[2];
long long maxmulti2 = p[0] * p[n-1] * p[n-2];
if(maxmulti1 > maxmulti2)
{
return maxmulti1;
}
else
{
return maxmulti2;
}
//return maxmulti3;
}
int main()
{
int n;
//printf("Please enter the length of the array: ");
scanf("%d", &n);
//int n;
long a[n];
//printf("please enter the number of the array:");
for(int i=0; i<n; ++i)
{
scanf("%ld", &a[i]);
}
long long max3 = maxmulti(a, n);
printf("%lld\n", max3);
return 0;
}
网友评论