Easy
题目描述
给你一个整数数组 nums,请你找出并返回能表示的三个数的最大乘积。
示例 1:
输入:nums = [1,2,3]
输出:6
示例 2:
输入:nums = [1,2,3,4]
输出:24
示例 3:
输入:nums = [-1,-2,-3]
输出:-6
提示:
3 <= nums.length <= 10^4-1000 <= nums[i] <= 1000
解题思路
解题思路
这道题要求找出数组中三个数的最大乘积。关键在于分析什么情况下能得到最大乘积。
核心观察: 要使三个数的乘积最大,只有两种可能的组合:
- 三个最大的正数:如果数组中有足够的正数
- 两个最小的负数 × 一个最大的正数:负负得正,可能比三个正数的乘积更大
解法一:排序法(推荐) 将数组排序后,最大乘积只可能出现在:
nums[n-1] × nums[n-2] × nums[n-3](三个最大数)nums[0] × nums[1] × nums[n-1](两个最小数和一个最大数)
解法二:一次遍历法 不需要完整排序,只需要找到最大的三个数和最小的两个数即可。这种方法时间复杂度更优。
两种方法都能解决问题,但一次遍历法在大数据量时更高效。
代码实现
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]);
}
};
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])
public class Solution {
public int MaximumProduct(int[] nums) {
Array.Sort(nums);
int n = nums.Length;
return Math.Max(nums[0] * nums[1] * nums[n-1],
nums[n-1] * nums[n-2] * nums[n-3]);
}
}
var maximumProduct = function(nums) {
nums.sort((a, b) => a - b);
const n = nums.length;
return Math.max(nums[0] * nums[1] * nums[n-1],
nums[n-1] * nums[n-2] * nums[n-3]);
};
复杂度分析
| 解法 | 时间复杂度 | 空间复杂度 |
|---|---|---|
| 排序法 | O(n log n) | O(1) |
| 一次遍历法 | O(n) | O(1) |
注:代码中给出的是排序法,因为代码更简洁易懂。如果追求最优时间复杂度,可以使用一次遍历找出最大三个数和最小两个数的方法。