Py学习  »  Python

在Python3.x中某些情况下获取超时错误

user15051990 • 5 年前 • 1625 次点击  

我正在处理欺诈活动通知问题: 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)
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53321
 
1625 次点击  
文章 [ 1 ]  |  最新文章 5 年前
user15051990
Reply   •   1 楼
user15051990    5 年前

我用左中等分和左中等分来解决这个问题。这是一种优化的方法。

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)