下面是我的代码。对于小值,它会返回正确的答案我在这里做的是找到任意两个数字之间的最小差异,这样它就不会形成负值。 实际上输入线是每年的成本,我需要找到最小的损失(是的,它只是一个损失)。 当输入很大时说20000个数字我得到超时错误。 以下是测试用例的链接:https://hr-testcases-us-east-1.s3.amazonaws.com/27771/input12.txt?AWSAccessKeyId=AKIAJ4WZFDFQTZRGO3QA&Expires=1502978445&Signature=vKwJ0MC3G1U3DXKE1N0qSruD5EI%3D&response-content-type=text%2Fplain
第一行包含多个值,后续行包含值。
#!/bin/python
import sys
number = long(raw_input().strip())
cost=map(long,raw_input().strip().split())
flag=1
j=0
mincost=max(cost)
print (mincost)
while j < number:
k=j+1
while k<number:
if mincost>abs(cost[j] - cost[k]) and cost[j]> cost[k]:
mincost=abs(cost[j] - cost[k])
k+=1
j+=1
print mincost
答案 0 :(得分:2)
对于20,000个数字,您有(20,000 x 19,999)/ 2 = 199,990,000成对比较。这是O(n ^ 2)复杂度。但是,如果对值进行排序,则两个相邻数字之间将出现最小差异。由于排序为O(n log n),您可以通过(a)对值进行排序,然后(b)找到连续对之间的最小差异来改进算法。
costs = [5, 4, 1, 8, 12]
sorted_costs = sorted(costs)
pairs = zip(sorted_costs[:-1], sorted_costs[1:])
differences = map(lambda (a, b): b - a, pairs)
print(min(differences)) # 1
剩下的唯一问题是你是否可以在O(n)时间内获得相同的结果。如果您的值是整数,则可以将排序减少到O(n)(具有潜在的巨大空间复杂度):
costs = [5, 4, 1, 8, 12]
min_cost = min(costs)
max_cost = max(costs)
flag_list = [False] * (max_cost - min_cost + 1)
for cost in costs:
flag_list[cost - min_cost] = True
sorted_costs = [i + min_cost for i, b in enumerate(flag_list) if b]
答案 1 :(得分:0)
为什么要导入sys? 'flag'的用途是什么? 如果你有足够的内存,我会做这样的事情:
import numpy as np
number = 20000
cost = np.random.rand(number) * 1e6 # just for the example
current_min = 1e10 # just for the example
for i,j in enumerate(cost):
diff = j-cost[i+1:]
pos = diff > 0
if pos.any():
temp = np.min(diff[pos])
if temp<current_min:
current_min = temp
print(final estimation: ',current_min)