给定一系列非负整数a0,…,an−1,
找到最大成对乘积,即可以通过将两个不同元素与序列相乘得到的最大整数(或者,更正式地,{{1} })。这里的不同元素表示带有max0≤i≠j≤n−1aiaj
的ai和aj(可能是i≠j
)。
输入格式
输入的第一行包含整数n。下一行包含n个非负整数ai=aj
。
约束
a0,…,an−1
。
输出格式
输出单个数字 - 最大成对产品。
此代码工作正常,但有时当我运行它时会显示:
2≤n≤2⋅105; 0≤a0,…,an−1≤105
仅当列表'a'中的总元素为2或3时显示此项。
如何改进此代码并修复该问题,此代码是否会显示超出时间限制或整数溢出错误?
Traceback (most recent call last):
File "C:\Users\gauta\AppData\Local\Programs\Python\Python35\gen.py", line 26, in <module>
print(max(c))
ValueError: max() arg is an empty sequence
答案 0 :(得分:3)
您的代码有两个缺陷:
您使用n
运行两个循环,但2
随机可以设置为range(2, 2)
。 c
是空序列,因此您的循环体不会运行,最终会出现一个空列表time
通过为其分配time.time() - b
表达式的结果来掩盖名称time.time
。任何进一步尝试访问AttributeError
都会给你一个a
,因为浮点对象没有这样的属性。重命名该变量。
接下来,您正在使用O(N ^ 2)方法;用于a
中每个元素数量增加的指数增长时间。这肯定会很快达到时间限制。您只需要在len(a)
中找到两个最大的整数并将它们相乘;这可以在O(N)线性时间内完成。因此,如果import heapq
import operator
if len(a) > 1:
result = operator.mul(*heapq.nlargest(2, a))
elif a:
result = a[0] # only one number, it's the largest
else:
result = None # no numbers, no result
为1000,则您的方法需要100万步,而线性时间方法只需要1000步。
在序列中找到K个最大数字的最有效方法是使用heapq.nlargest()
function,它在O(NlogK)时间内找到这些数字;对于固定的K = 2,这使得这成为O(N)线性时间方法。您可以使用operator.mul()
function乘以找到的两个整数:
{{1}}
答案 1 :(得分:1)
建议不要使用变量名称,它也是您正在使用的模块的名称
import random
import time
b=time.time()
a=list()
c=list()
n=random.randint(2,12)
#appending random numbers in a list 'a'
g=1
while(g<=n):
a.append(random.randint(0,10))
g=g+1
print(a)
print("Total elements in the list= %s"%len(a))
#Appending Done
for i in range(2,n):
for j in range (2,n):
if a[i]*a[j]>0:
if a[i]!=a[j]:
m=a[i]*a[j]
c.append(m)
else:
continue
else:
continue
print(max(c))
othertime=time.time()-b
print(type(othertime)) #here in this line you changed the time to float value hence now onwards you can't use time module as you were using before hence i renamed time variable to other.
print("%s" %(time.time()-b))
通过将变量名称时间更改为其他时间,您可以再次使用时间模块,所以请记住以后永远不要将变量命名为其他模块名称或关键字名称,否则它们的行为将在您的代码中丢失。