力扣 leetcode 628. 三个数的最大乘积

Topic:

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

Example_1:

输入: [1,2,3]
输出: 6

Example_2:

输入: [1,2,3,4]
输出: 24

Solution_1(多次遍历):

不断对数组中的数取样和排列
判断最大的值后直接返回
运算效率极低不推荐

Code_1:

class Solution:
    def maximumProduct(self, nums: List[int]) -> int:
        n = len(nums)
        return max(nums[i] * nums[j] * nums[b] 
        	for i in range(n) for j in range(i + 1, n) for b in range(j + 1, n))

Solution_2(贪心):

首先将数组进行排序
对于全是负数和全是正数的情况:
仅需返回最大的三个数的乘积

对于数组中既有正数又有复数的情况:
若有三个正数以上,那么三个正数的乘积有可能为最大
若至少有两个负数数,那么最小的两个负数相乘会得到一个较大的正数
那么这个正数与最大的正数的乘积同样可能为最大

Code_2:

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

Solution_3(线性扫描):

在理解了第二种解决方法的基础上对第二种进行优化
先找出前三位中的数按大到小排列为max_1, max_2, max_3
之后找出前两位中的数从大到小找出min_2, min_1

然后在遍历的过程中进行判断
不断对其中的值进行更新
最后同样是输出第二种方法中的最大值

Code_3:

class Solution:
    def maximumProduct(self, nums: List[int]) -> int:
        max_1, max_2, max_3 = sorted([nums[0], nums[1], nums[2]])
        min_2, min_1 = sorted([nums[0], nums[1]])
        
        for i in nums:
            if i > max_1:
                max_3 = max_2
                max_2 = max_1
                max_1 = i 


            elif i <= max_1 and i >= max_2:
                max_3 = max_2
                max_2 = i

            elif i <= max_2 and i >= max_3:
                max_3 = i

            if i <= min_1:
                min_2 = min_1
                min_1 = i 

            elif i >= min_1 and i <= min_2:
                min_2 = i
            
        return max(min_1 * min_2 * max_1, max_1 * max_2 * max_3)

Result:

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值