开学回归力扣:第十题——628. 三个数的最大乘积

628. 三个数的最大乘积

给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

示例 1:

输入:nums = [1,2,3]
输出:6
示例 2:

输入:nums = [1,2,3,4]
输出:24
示例 3:

输入:nums = [-1,-2,-3]
输出:-6
 

提示:

3 <= nums.length <= 104
-1000 <= nums[i] <= 1000

题解:

方法一:排序

通过分析题目我们可以知道在排序后当数组全负或全正时其返回的就是最后三个数的乘积。而当有负有正时,我们发现其返回的要么还是最大的仨数乘积,要么就是最大的数与最小的两个数的乘积,因此我们分别算出比较大小即可。
需要注意的是数组最小长度就是3,因此不会出现重复计算的情况。
且我们或许会想到如果最小的两个数不全为负怎么办?
其实这很明显,因为在数组有正有负的情况下,其最大乘积就是存在两种可能性,而另一种如果只有一个负数时我们发现你乘积必定小于0,所以直接通过比较输出另一种方案了。

代码:

int cmp(int*x,int*y)
{
    
    
    return *x>*y;
}
int maximumProduct(int* nums, int numsSize){
    
    
    qsort(nums,numsSize,sizeof(int),cmp);
    int max = 0;
    if(nums[numsSize-1]*nums[numsSize-2]*nums[numsSize-3]>nums[numsSize-1]*nums[0]*nums[1])
    {
    
    
        max = nums[numsSize-1]*nums[numsSize-2]*nums[numsSize-3];
    }
    else
    {
    
    
        max = nums[numsSize-1]*nums[0]*nums[1];
    }
    return max;
}

方法二:线性查找最大的三个数和最小的两个数即可

猜你喜欢

转载自blog.csdn.net/xiangguang_fight/article/details/114751781