628. 三个数的最大乘积

题目描述

 给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

 【注意】给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。
     输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。

原题请参考链接https://leetcode-cn.com/problems/maximum-product-of-three-numbers/

题解

方法一 【排序法】

class Solution:
    def maximumProduct(self, nums: List[int]) -> int:
        nums.sort()
        return max(nums[-1] * nums[-2] * nums[-3], nums[0] * nums[1] * nums[-1])

方法二 【非排序法】

// 此方法的精妙之处在于一次遍历找出5个值,即最大值,第二大值,第三大值,最小值,次小值
// 问题的解无非两个最小的负数乘最大的正数【数组中有正负】,两个最小的负数乘最大的负数【数组中只有负】,
// 三个最大的正数相乘【数组中有正负或者只有正】
class Solution:
    def maximumProduct(self, nums: List[int]) -> int:
        # nums.sort()
        # a = nums[-1] * nums[-2] * nums[-3]
        # b = nums[0] * nums[1] * nums[-1]
        # return max(a, b)
        max1 = -float('inf')       # 第一大的值
        max2 = -float('inf')       # 第二大的值
        max3 = -float('inf')       # 第三大的值
        min1 = float('inf')        # 第一小的值
        min2 = float('inf')        # 第二小的值

        for num in nums:
            if num > max1:         
                max3 = max2        
                max2 = max1        
                max1 = num         
            elif num > max2:       
                max3 = max2        
                max2 = num         
            elif num > max3:       
                max3 = num         
            
            if num < min1:         
                min2 = min1        
                min1 = num         
            elif num < min2:       
                min2 = num                  
        return max(max1 * max2 * max3, max1 * min1 * min2)

posted @ 2021-01-20 19:39  Bladers  阅读(97)  评论(0)    收藏  举报