我的代码每次运行时都不起作用

时间:2016-06-30 06:25:37

标签: python

给定一系列非负整数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

2 个答案:

答案 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))  

通过将变量名称时间更改为其他时间,您可以再次使用时间模块,所以请记住以后永远不要将变量命名为其他模块名称或关键字名称,否则它们的行为将在您的代码中丢失。