628. 三个数的最大乘积
Difficulty: 简单
给你一个整型数组 nums
,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 1:
输入:nums = [1,2,3]
输出:6
示例 2:
输入:nums = [1,2,3,4]
输出:24
示例 3:
输入:nums = [-1,-2,-3]
输出:-6
提示:
3 <= nums.length <= 10<sup>4</sup>
-1000 <= nums[i] <= 1000
Solution
Language: golang
func maximumProduct(nums []int) int {
// 三个数的最大乘积
// 1 ,3,5, 5, 6
// 如果都是正数,排序之后,选三个最大的
// -100 ,-99 ,- 88 , -10 , -2 ,-1
// 如果都是负数,排序之后,选三个最小的
// 如果有正数,有负数,那么也只有可能是1.两个最大的负数和一个最大的正数,2.三个最大的正数
// -100 , -99 , 0 , 1 ,2 , 3 , 200 , 300
length := len(nums)
if length < 3 {
return 0
}
sort.Ints(nums)
//都是正数
nums1 := nums[length-1] * nums[length-2] * nums[length-3]
//都是负数
nums2 := nums[0] * nums[1] * nums[2]
//正数和负数
nums3 := nums[0] * nums[1] * nums[length-1]
return max(max(nums1, nums2), nums3)
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
优化方案
func maximumProduct(nums []int) int {
// 三个数的最大乘积
// 1 ,3,5, 5, 6
// 如果都是正数,排序之后,选三个最大的
// -100 ,-99 ,- 88 , -10 , -2 ,-1
// 如果都是负数,排序之后,选三个最小的
// 如果有正数,有负数,那么也只有可能是1.两个最大的负数和一个最大的正数,2.三个最大的正数
// -100 , -99 , 0 , 1 ,2 , 3 , 200 , 300
length := len(nums)
if length < 3 {
return 0
}
sort.Ints(nums)
//都是正数
nums1 := nums[length-1] * nums[length-2] * nums[length-3]
//都是负数,nums2 := nums[0] * nums[1] * nums[2] 这里其实也是不需要的,都是负数的时候,也是三个最大相乘,因为最终结果还是负数
//正数和负数
nums2 := nums[0] * nums[1] * nums[length-1]
return max(nums1, nums2)
}
func max(a, b int) int {
if a > b {
return a
}
return b
}