628.3つの数値の最大積
整数の配列numsを指定し、配列内の3つの数値の最大の積を見つけて、この積を出力します。
示例 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
回答:
方法1:並べ替え
問題を分析することにより、ソート後に配列がすべて負またはすべて正の場合、最後の3つの数値の積が返されることがわかります。負と正がある場合、3つの数値の最大の積、または最大の数値と最小の2つの数値の積のいずれかが返されることがわかるため、比較を個別に計算できます。
配列の最小長は3であるため、二重カウントは行われないことに注意してください。
そして、最小の2つの数値がすべて負ではない場合、どうすればよいか考えるかもしれません。
実際、これは非常に明白です。配列に正と負がある場合、最大の積は2つの可能性があることであり、負の数が1つしかない場合は、積が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;
}
方法2:最大の3つの数と最小の2つの数を線形に見つける