文章目录
- 一【题目类别】
- 二【题目难度】
- 三【题目编号】
- 四【题目描述】
- 五【题目示例】
- 六【题目提示】
- 七【解题思路】
- 八【时间频度】
- 九【代码实现】
- 十【提交结果】
一【题目类别】
- 排序
二【题目难度】
- 简单
三【题目编号】
- 628.三个数的最大乘积
四【题目描述】
- 给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
五【题目示例】
-
示例 1:
- 输入:nums = [1,2,3]
- 输出:6
-
示例 2:
- 输入:nums = [1,2,3,4]
- 输出:24
-
示例 3:
- 输入:nums = [-1,-2,-3]
- 输出:-6
六【题目提示】
- 3 < = n u m s . l e n g t h < = 1 0 4 3 <= nums.length <= 10^4 3<=nums.length<=104
- − 1000 < = n u m s [ i ] < = 1000 -1000 <= nums[i] <= 1000 −1000<=nums[i]<=1000
七【解题思路】
- 分情况讨论:
- 数组全是正数:数组最后三个数的乘积最大
- 数组全是负数:数组最后三个数的乘积最大
- 数组有正数有负数:数组最前面两个数和最后一个数的乘积最大,或者最后三个数的乘积最大
- 综上所述:要么是数组最后三个数的乘积最大,要么是数组最前面两个数和最后一个数的乘积最大,只需要返回较大值就可以了
- 最后返回结果即可
八【时间频度】
- 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn), n n n为传入的数组的长度
- 空间复杂度: O ( l o g n ) O(logn) O(logn), n n n为传入的数组的长度
九【代码实现】
- Java语言版
class Solution {
public int maximumProduct(int[] nums) {
Arrays.sort(nums);
int len = nums.length;
int maxOne = nums[len - 1];
int maxTwo = nums[len - 2];
int maxThree = nums[len - 3];
int minOne = nums[0];
int minTwo = nums[1];
if(maxOne * maxTwo * maxThree > minOne * minTwo * maxOne){
return maxOne * maxTwo * maxThree;
}else{
return minOne * minTwo * maxOne;
}
}
}
- C语言版
int cmp(const void *a, const void *b)
{
return *(int*)a - *(int*)b;
}
int maximumProduct(int* nums, int numsSize)
{
qsort(nums, numsSize, sizeof(int), cmp);
return fmax(nums[0] * nums[1] * nums[numsSize - 1], nums[numsSize - 1] * nums[numsSize -2] * nums[numsSize - 3]);
}
- Python语言版
class Solution:
def maximumProduct(self, nums: List[int]) -> int:
nums.sort()
n = len(nums)
return max(nums[0] * nums[1] * nums[n - 1], nums[n - 1] * nums[n - 2] * nums[n - 3])
- C++语言版
class Solution {
public:
int maximumProduct(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
return max(nums[0] * nums[1] * nums[n - 1], nums[n - 1] * nums[n - 2] * nums[n - 3]);
}
};
十【提交结果】
-
Java语言版
-
C语言版
-
Python语言版
-
C++语言版