在 python 3.x 中的某些情况下出现超时错误
Getting timeout error for some cases in python 3.x
我正在处理欺诈 Activity 通知问题:https://www.hackerrank.com/challenges/fraudulent-activity-notifications/。我已经写了下面的代码
解决这个问题。这段代码在某些测试用例中运行良好,但在某些测试用例中运行失败,出现超时错误。谁能帮助我了解如何优化
并让它变得更好?
def calculate_median(lists):
n = len(lists)
lists.sort()
if n % 2 == 0:
median1 = lists[n//2]
median2 = lists[n//2 - 1]
median = (median1 + median2)/2
else:
median = lists[n//2]
return median
my_list = [2,3,4,2,3,6,8,4,5]
d=5
n = len(my_list)
count = 0
start= 0
end = d
for i in range(0, len(my_list)):
if end < n:
seg_list = my_list[start:end]
check_val = my_list[end]
median_val = calculate_median(seg_list)
if check_val >= 2 *median_val:
count = count +1
start = start + 1
end = end + 1
print(count)
我已经用bisect_left和insort_left解决了这个问题。这是优化的方法之一。
from bisect import bisect_left, insort_left
count = 0
listD = sorted(my_list[:d])
def median():
return listD[d//2] if d%2 == 1 else ((listD[d//2] + listD[d//2-1])/2)
for i in range(d,n):
if my_list[i] >= 2*median():
count += 1
del listD[bisect_left(listD, my_list[i-d])]
insort_left(listD, my_list[i])
print(count)
我正在处理欺诈 Activity 通知问题:https://www.hackerrank.com/challenges/fraudulent-activity-notifications/。我已经写了下面的代码 解决这个问题。这段代码在某些测试用例中运行良好,但在某些测试用例中运行失败,出现超时错误。谁能帮助我了解如何优化 并让它变得更好?
def calculate_median(lists):
n = len(lists)
lists.sort()
if n % 2 == 0:
median1 = lists[n//2]
median2 = lists[n//2 - 1]
median = (median1 + median2)/2
else:
median = lists[n//2]
return median
my_list = [2,3,4,2,3,6,8,4,5]
d=5
n = len(my_list)
count = 0
start= 0
end = d
for i in range(0, len(my_list)):
if end < n:
seg_list = my_list[start:end]
check_val = my_list[end]
median_val = calculate_median(seg_list)
if check_val >= 2 *median_val:
count = count +1
start = start + 1
end = end + 1
print(count)
我已经用bisect_left和insort_left解决了这个问题。这是优化的方法之一。
from bisect import bisect_left, insort_left
count = 0
listD = sorted(my_list[:d])
def median():
return listD[d//2] if d%2 == 1 else ((listD[d//2] + listD[d//2-1])/2)
for i in range(d,n):
if my_list[i] >= 2*median():
count += 1
del listD[bisect_left(listD, my_list[i-d])]
insort_left(listD, my_list[i])
print(count)