Codilityというサイトの以下の問題がわかりません
平面上にN個の円盤を描きます。円盤には0からN - 1までの番号が振られている。円盤の半径を指定するN個の非負の整数の配列Aが与えられる。J番目の円盤は中心が(J, 0)で半径がA[J]となるように描かれる。J番目の円盤とK番目の円盤が交差するのは、J≠Kで、J番目とK番目の円盤に少なくとも1つの共通点があるときである(円盤には境界線が含まれていると仮定する)。下の図は、N=6、Aを次のようにして描いた円盤である。
A[0] = 1 A[1] = 5 A[2] = 2 A[3] = 1 A[4] = 4 A[5] = 0交差する円盤の組は、円盤1と円盤4が交差し、両方とも他のすべての円盤と交差する、円盤2も円盤0と円盤3と交差する、という11組(順不同)である。上記のようにN個の円盤を記述した配列Aが与えられたとき、交差する円盤の(順不同の)ペアの数を返す関数def solution(A)を書きなさい。この関数は、交差するペアの数が10,000,000を超える場合には-1を返すべきである。上に示した配列Aが与えられた場合、この関数は上で説明したように11を返すべきである。以下の仮定に対する効率的なアルゴリズムを書け。Nは[0...100,000]の範囲の整数、配列Aの各要素は[0...2,147,483,647]の範囲の整数である。
My Answer
Python
1def solution(A): 2 # write your code in Python 3.6 3 ans=0 4 pairs=[] 5 r=[[0 for j in range(2)] for i in range(len(A))] 6 for i,a in enumerate(A): 7 r[i][0]=i+a 8 r[i][1]=i-a 9 R=sorted(r,reverse=True) 10 #print(R) 11 for i in range(len(A)): 12 maxr=R[i][0] 13 minr=R[i][1] 14 for j in range(len(A)-1,i,-1): 15 #print("j=",j) 16 if R[j][0]<=maxr and R[j][0]>=minr: 17 pairs.append((j,i)) 18 #print(len(pairs)) 19 ans=len(pairs) 20 if ans>10000000: 21 return -1 22 #print(len(pairs)) 23 return ans 24
N^2でタイムオーバーになります。教えていただけませんか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。