2016-06-30 5 views
0

Учитывая последовательность неотрицательных целых чисел a0,…,an−1,, найдите максимальное попарное произведение, то есть самое большое целое число, которое можно получить, умножив два разных элемента из последовательности (или, более формально, max0≤i≠j≤n−1aiaj). Различные элементы здесь означают ai и aj с i≠j (это может быть случай ai=aj).Мой код Не работает каждый раз, когда я запускаю его

Входной формат

Первая строка входного файла содержит целое число п. Следующая строка содержит n неотрицательных целых чисел a0,…,an−1.

Ограничения

2≤n≤2⋅105; 0≤a0,…,an−1≤105.

Выходной формат

Вывести единственное число - максимальное попарно продукт.

Этот код работает отлично, но иногда, когда я запускаю его он показывает:

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 или 3.

Как я могу улучшить это кода и исправить эту проблему, и будет ли этот код показывать превышение времени или ошибку переполнения целого числа?

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)) 
time=time.time()-b 
print("%s"%(time.time()-b)) 
+0

'времени = time.time() - b' заменяет имя' time'. Этот код * никогда * не работает. –

+0

Вы переписываете 'time' в строке' time = time.time() - b', просто измените на 't = time.time() - b' и' print (t) ' – AChampion

+0

, благодаря этому решает проблему времени. Любое предложение, как я могу сделать этот код более быстрым и без ошибок переполнения целого числа (если есть) –

ответ

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

Изменяя переменной времени имя на другое время, вы можете использовать модуль времени снова так помните эту вещь в будущем никогда не указывать переменные с именами других модулей или именами ключевых слов, иначе их поведение будет потеряно в вашем коде.

+0

Спасибо Rajan.I исправит его –

+0

Это не исправило случайное исключение 'ValueError'. –

3

Ваш код имеет два недостатка:

  • Вы бежите две петли с range(2, n), но n случайным образом может быть установлен в 2. range(2, 2) является пустой последовательностью, поэтому ваше тело цикла не будет работать, и вы в конечном итоге с пустым списком c

  • Вы маскировать имя time путем присвоения результата time.time() - b выражения к нему. Любые дальнейшие попытки доступа к time.time предоставят вам AttributeError, поскольку объект с плавающей точкой не имеет такого атрибута. Переименуйте эту переменную.

Далее вы используете подход O (N^2); экспоненциальный рост времени, используемый для каждого увеличения количества элементов в a. Это, безусловно, очень быстро ударит по срокам. Все, что вам нужно, - найти два самых больших целых числа в a и умножить их; это можно сделать в O (N) линейном времени. Поэтому, если len(a) - 1000, ваш подход требует 1 миллион шагов, в то время как линейный временной подход займет всего 1000 шагов.

Самый эффективный способ найти K наибольших чисел в последовательности - использовать heapq.nlargest() function, который находит эти числа в O (NlogK); для фиксированного K = 2, что делает этот подход O (N) линейным временем. Вы можете использовать operator.mul() function для умножения двух целых чисел найдено:

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 
+0

Спасибо Martijn.I не знал о модуле heapq и operator, теперь я могу использовать его в своем коде –

Смежные вопросы