三个数的最大乘积

133 阅读1分钟

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
}