首页 > 试题广场 >

最大乘积

[编程题]最大乘积
  • 热度指数:6529 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)。
n<=1e5。

输入描述:
第一行是数组大小n,第二行是无序整数数组A[n]


输出描述:
满足条件的最大乘积
示例1

输入

4
3 4 1 2

输出

24
import sys
n=int(sys.stdin.readline().strip())
arr=list(map(int,sys.stdin.readline().strip().split()))
arr.sort()
res=max(arr[0]*arr[1]*arr[-1],arr[-1]*arr[-2]*arr[-3])
print(res)

发表于 2019-04-03 11:45:30 回复(0)

看了下大家的分享,发现只有我考虑了比较多。。。如果正数的个数不够三个怎么办,如果一个正数都没有呢。。。
而且为了符合题意,还是用了遍历。

    n =int(raw_input())
    a =raw_input().split(' ')
    pos =[]
    neg =[]
    neg_min =[]
    for i in a:
        i =int(i)
        if i>0:
            if len(pos)<3:
                pos.append(i)
            else:
                if i > min(pos):
                    pos[pos.index(min(pos))] =i
        else:
            if len(neg)<2:
                neg.append(i)
            else:
                if i < max(neg):
                    neg[neg.index(max(neg))] =i
            if len(neg_min)<3:
                neg_min.append(i)
            else:
                if i > min(neg_min):
                    neg_min[neg_min.index(min(neg_min))] =i
    if len(pos) ==0:
        print(neg_min[0] *neg_min[1] *neg_min[2])
        exit(0)
    if len(neg) ==2 and len(pos)==3:
        max1 =max(pos)
        pos.pop(pos.index(max1))
        result =max1*pos[0]*pos[1] if max1*pos[0]*pos[1]>neg[0]*neg[1]*max1 else neg[0]*neg[1]*max1
    elif len(neg) ==2 and len(pos) > 0:
        result =neg[0] *neg[1] *max(pos)
    elif len(neg) < 2:
        result = pos[0] *pos[1] *pos[2]
    print(result)
发表于 2019-03-09 23:59:15 回复(0)

python两行

假装没看到时间复杂度要求。


  1. 先对数组进行排序
  2. 如果全为负数或全为正数,取最后三个数相乘既为最大乘积。关键是既有正数又有负数的情况(0其实可以看作负数)。如果有两个正数(例如[-2,-1,0,1,2]),那么最大值为arr[0] * arr[1] * arr[-1], 如果有一个正数(例如[-2,-1,0,2]),最大值同样为arr[0] * arr[1] * arr[-1]。
  3. 结合上面两种情况,只需要取max(arr[-1] * arr[-2] * arr[-3], arr[0] * arr[1] * arr[-1])

length, arr = input(), sorted(map(int, input().split()))
print(max(arr[-1] * arr[-2] * arr[-3],  arr[0] * arr[1] * arr[-1]))
编辑于 2019-03-02 10:54:20 回复(0)