leetcode算法628. 三个数的最大乘积

155 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情

一、题目描述:

628. 三个数的最大乘积 - 力扣(LeetCode)

给你一个整型数组 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

二、思路分析:

这里的关键点是负数如果想要乘积最大,必须要两两结合(负负等正);
所以我们先假设有个普通的数组,数组中有正数有负数,我们现在找出乘积最大的两位数:最大的两位数a和b相乘或最小的两位数d和e相乘;然后数组在除去a、b后在剩下的元素中找出最大值c相乘;数组除去d、e后再剩下的元素中找出最大值a相乘(因为负数必须两两一组);所以最大的值是abc或者ade。

三、AC 代码:

# 解题思路
# 乘积最大的数必定是最大的三位数相乘或者最大的一位数乘以最小的两位数,所以要求就是找出最大的三位数和最小的两位数
def maximumProduct(nums: List[int]) -> int:
    if len(nums) == 3 :
        return nums[0]*nums[1]*nums[2]
    elif len(nums) > 3 :
        # a, b, c分别是最大的三位数,d, e分别是最小的两位数
        a = b = c = -1001
        d = e = 1001
        for x in nums:
            # 找出最大的三个数a最大,c第三
            if x > c :
                if x > b :
                    if x > a :
                        c = b
                        b = a
                        a = x
                    else :
                        c = b
                        b = x
                else :
                    c = x
            
            if x < e :
                if x < d :
                    e = d
                    d = x
                else :
                    e = x
        
        return max(a*b*c, a*d*e)

范文参考:

一个大根堆维护两个最小值,一个小根堆维护三个最大值,最后看一下哪个乘出来大即可 - 三个数的最大乘积 - 力扣(LeetCode)

JavaScript解题思路 一看就会 - 三个数的最大乘积 - 力扣(LeetCode)