今天刷到leetcode中628题求数组中三个数的最大乘积题目及条件如下
这道题目可以先对数组进行排序,后调用其值,代码如下
int maximumProduct(int* nums, int numsSize){
int i,j;//用于遍历nums
int product;
int max1=0;
if(numsSize<=3)
return nums[0]*nums[1]*nums[2];
else if(numsSize>3)
{
for(i=0;i<=numsSize;i++)
{
for(j=i+1;j<numsSize;j++)
{
if(nums[i]<nums[j])
{
max1=nums[j];
nums[j]=nums[i];
nums[i]=max1;
}
}
}
product=nums[0]*nums[1]*nums[2];
}
if(nums[numsSsize-1]*nums[numsSize-2]*nums[0]>product)//如果最低两位为负数,且与最大数乘积大于原有值输出该值
{
product=nums[numsSsize-1]*nums[numsSize-2]*nums[0]
}
return product;
}
但上述代码有一定缺陷,当数组内元素过多,处理时间过长,不满足leetCode对时间的限制。
代码如下:
int cmp(const void *a,const void *b){
return *(int *)a-*(int *)b;
}
int maximumProduct(int* nums, int numsSize){
qsort(nums ,numsSize,sizeof(nums[0]),cmp);//将数组从小到大排序
long max,max1,max2,max3;
max1=nums[0]*nums[1]*nums[2];//当全为负时前三个数相乘最大
max2=nums[numsSize-1]*nums[numsSize-2]*nums[numsSize-3];//全为正数时最大三个数相乘最大
max3=nums[0]*nums[numsSize-1]*nums[1];//当数组正负数都有时要判断两负数和最大的正数相乘的值是否为最大值
if(max3>max2&&max3>max1)
max=max3;
else if(max2>max1)
max=max2;
else
max=max1;
return max;
}