给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)。
n<=1e5。
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)
看了下大家的分享,发现只有我考虑了比较多。。。如果正数的个数不够三个怎么办,如果一个正数都没有呢。。。
而且为了符合题意,还是用了遍历。
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)
假装没看到时间复杂度要求。
length, arr = input(), sorted(map(int, input().split()))
print(max(arr[-1] * arr[-2] * arr[-3], arr[0] * arr[1] * arr[-1]))