leetcode 628 Maximum Product of Three Numbers c语言 (找到第k大的数)

来源:互联网 发布:java防止sql注入转义 编辑:程序博客网 时间:2024/05/22 00:25

看到这个题,只需要考虑三个数的乘积为最大的即可,就是要首先为正数,其次值最大。首先的想法就是排序,先排序一下,会发现什么呢? 就能感觉出要么答案是最大的三个数的乘积,要么是两个最小的数的乘积再乘上最大的那个数,所以答案就呼之欲出了。

试了一下冒泡排序发现超时,这里用到c语言自带的快速排序的函数,在stdlib.h中,函数为qsort,网上搜了一下,qsort(首地址,元素个数,sizeof(每个元素的大小),cmp),

函数的四个参数是这个,cmp为一个 int 型    int cmp(const void* a,const void* b)   { return *(int*)a -*(int*)b //从小到大排序}  //反之从大到小  这样即可

#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a, const void *b)
{
    return *(int*)a - *(int*)b; //由小到大排序
}
int maximumProduct(int* nums, int numsSize) {
    qsort(nums,numsSize,sizeof(0),cmp);
    int k1,k2;
    k1=nums[0]*nums[1]*nums[numsSize-1];
    k2=nums[numsSize-1]*nums[numsSize-2]*nums[numsSize-3];
    return k1>k2? k1:k2;
}

这个有39ms

然后再搜了一下,发现可疑通过o(n)解决,其实原理也是一样的,就是找到最大的三个数或者最小的两个数和最大的那个数 比较这两个的乘积谁最大,这样就可以了。

#include<stdio.h>
#include<stdlib.h>
#define max(a,b) (a>b? a:b)
#define min(a,b) (a>b? b:a)
int min3(int a,int b,int c)
{
    return min(a,b)<c? min(a,b):c;
}
int max3(int a,int b,int c)
{
    return max(a,b)>c? max(a,b):c;
}
int mid(int a,int b,int c)
{
    if(a>=min(b,c)&&a<=max(b,c))
    {printf("%d %d %d\n",a,min(b,c),max(b,c));return a;}
    if(b>=min(a,c)&&b<=max(a,c))
        return b;
    return c;
}
int maximumProduct(int* nums, int numsSize) {
    int max1=max3(nums[0],nums[1],nums[2]),max3=min3(nums[0],nums[1],nums[2]);
    int max2=mid(nums[0],nums[1],nums[2]);
    
   
    int min1=min(nums[0],nums[1]),min2=max(nums[0],nums[1]);
   for(int i=0;i<numsSize;i++)
    {
        if(i>=3){
       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(i>=2){
        if(nums[i]<min1)
        {
            min2=min1;
            min1=nums[i];
        }
        else if(nums[i]<min2)
            min2=nums[i];
        }
    }
    int k1=max1*max2*max3;
    int k2=min1*min2*max1;
    return k1>k2? k1:k2;
}

19MS

阅读全文
0 0