美文网首页
力扣(LeetCode)之三个数最大乘积

力扣(LeetCode)之三个数最大乘积

作者: 小黄不头秃 | 来源:发表于2023-09-01 16:22 被阅读0次
题目:

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

示例:

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

输入:nums = [-1,-2,-3]
输出:-6

分析题目:这个题目中我们需要考虑三种情况:全为正数、全为负数、有正有负

  • 全为正数:我们仅需要取出最大的三个数进行乘积。
  • 全为负数:与上述一致,我们仅需要取出最大的三个数进行乘积。
  • 有正有负:我们需要取出最大的正数,还有最小的两个负数,求这三个数的最大值。
    这样我们就能够求出一个整数数组中的三个数的最大乘积。
方法一:排序后再求结果

我们可以首先将数组进行排序,然后对相对应的值进行乘积,这样算法的复杂度完全取决于排序算法的复杂度了 O(n)=n*log_n。下面是该算法的实现:

# 先排序后比较大小
def fun1(arr):
    l = len(arr)
    arr =  sorted(arr) # 从小到大
    return max(arr[l-1]*arr[l-2]*arr[l-3], arr[0]*arr[1]*arr[l-1])
方法二:直接求取三个数相乘的最大值

这个算法的时间复杂度就是 O(n)=n,我们仅需要将数组循环一遍就能够将最大值,最小值求出来,最后比较大小即可,具体算法如下:

# 求取最大最小值
def fun2(arr):
    min1 = float('inf')
    min2 = float('inf')
    max1 = -float('inf')
    max2 = -float('inf')
    max3 = -float('inf')
    for i, x in enumerate(arr):
        if x < min1:
            min2 = min1
            min1 = x
        elif x < min2:
            min2 = x 
        
        if x > max1:
            max3 = max2 
            max2 = max1 
            max1 = x 
        elif x > max2:
            max3 = max2 
            max2 = x
        elif x > max3:
            max3 = x 
    return max(max1*max2*max3, max1*min1*min2)

相关文章

网友评论

      本文标题:力扣(LeetCode)之三个数最大乘积

      本文链接:https://www.haomeiwen.com/subject/sronmdtx.html