[英]Sum of quotients when all array elements is divided by each array elements
在編碼測試中遇到一個問題,假設我們有數組, arr = [4,3,8]
。 將數組除以4得到1(4/4)+ 0(3/4)+ 2(8/4)=3。類似地,將3除以4得到4,而將8除以1。因此輸出為3 + 4 + 1 = 8 O(n2)
解決方案賦予了TLE,所以我試圖做得更好。
我想到了排序和使用下限。 arr[i]*k
下界,對於k = 1,2,3...
,直到arr[i]*k<=max(arr)
,將使我的元素數量大於所取的倍數,這將使添加最終結果。 但這給了我錯誤的答案。 如何有效解決此問題,歡迎提出任何建議。
如果我正確理解了您的問題,則(在此示例中)您需要三個數組,它們是原始數組除以三個元素中的每個元素(用整數除法),然后求和。
arr = [4,3,8]
sum([el//i for i in arr for el in arr])
會給你想要的結果。 為了理解,結果列表為:
In [8]: [el//i for i in arr for el in arr]
Out[8]: [1, 0, 2, 1, 1, 2, 0, 0, 1]
總結得出結果8
。 如果您確實需要以這種方式分開而不是將三個數組分開,那么我將編輯此答案。
編輯所以我誤解了這個問題,對不起。 如果允許使用numpy,我建議使用此算法,該算法(我認為)仍為O(n²),但總體上要快得多:
arr = np.random.randint(1,10,n)
np.sum(np.tile(arr, n)//np.repeat(arr,n))
也許我明天可以想出一些更聰明的東西
編輯2排序實際上是一個好主意,可以稍微加快算法的速度。 到目前為止,我已經使用此腳本測試了這三種解決方案(我知道, time.time
不適用於精確時間,但是它僅顯示了每種算法的總體速度):
for n in range(100, 500):
arr = np.random.randint(1,10,n)
#sorted
t = time.time()
arr2 = sorted(arr)
sum([el1//el2 for i, el2 in enumerate(arr2) for el1 in arr2[i:]])
t2 = time.time()-t
times_sorted.append(t2)
#standard
t = time.time()
arr = sorted(arr)
sum([el1//el2 for el2 in arr for el1 in arr])
t2 = time.time()-t
times_standard.append(t2)
#numpy
t = time.time()
arr = sorted(arr)
np.sum(np.tile(arr, n)//np.repeat(arr, n))
t2 = time.time()-t
times_numpy.append(t2)
if not n%50:
print(n)
用繪圖
plt.figure()
plt.plot(times_numpy)
plt.plot(times_sorted)
plt.plot(times_standard)
plt.legend(["numpy", "sorted", "standard"])
plt.xlabel("n")
plt.ylabel("time in s")
得到:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.