有n個元素,編號1.2…n,每一對元素之間的大小關係是確定的,關係具有反對稱性,但不具有傳遞性。
注意:不存在兩個元素大小相等的情況。
也就是說,元素的大小關係是n個點與n*(n-1)/2條有向邊構成的任意有向圖。
然而,這是一道互動式試題,這些關係不能一次性得知,你必須通過不超過10000次提問來獲取資訊,每次提問只能了解某兩個元素之間的關係。
現在請你把這n個元素排成一行,使得每個元素都小於右邊與它相鄰的元素。
你可以通過我們預設的bool函式compare來獲得兩個元素之間的大小關係。
例如,編號為a和b的兩個元素,如果元素a小於元素b,則compare(a,b)返回true,否則返回false。
將n個元素排好序後,把他們的編號以陣列的形式輸出,如果答案不唯一,則輸出任意乙個均可。
資料範圍
1≤n≤1000
輸入樣例
[[0, 1, 0], [0, 0, 0], [1, 1, 0]]
輸出樣例[3, 1, 2]
我們假設已經排好k-1
個元素的位置, 如果我們能確認第k
個的位置,那這題就解開一半了。這第k
個元素如果直接乙個個查詢的話,那麼總共需n^2
次查詢顯然當n為1000時會compare次數會超過10000. 所以我們可以採用二分去查第k
個元素的插入位置。用二分檢索,每次可以刪掉一半元素,所以時間複雜度是 o(logn)
我們已知元素序列不具備傳遞性。為什麼還可以用二分查詢呢我們通常認為,二分是需要滿足單調性的,但在這題裡我們並不需要使整個序列滿足單調性,只需要利用二分快速找到乙個滿足條件的位置即可。因此當compare(res[mid],i) ==true
時就在右邊找,否則就在左邊找就可定位到乙個合法的位置。
另外,我們還可使用歸併排序ac此題。
不具備傳遞性則 :a < b, b < c 不能推出 a < c
// forward declaration of compare api.
// bool compare(int a, int b);
// return bool means whether a is less than b.
class
solution
res.
push_back
(i);
for(
int j = res.
size()
-2;j > r;j--
)swap
(res[j]
,res[j +1]
);}return res;}}
;
二分插入 bisect
在乙個有序序列 從小到大 中查詢乙個元素 每次將元素與序列中間位置的元素進行比較 如果大於中點,則在後半段。如果小於中點,則在前半段。以此類推 時間複雜度為o logn 有乙個無序序列 37,99,73,48,47,40,40,25,99,51 對其先排序輸出新列表。分別插入20 40 41 100...
bisect模組二分插入
比如說 我想插入乙個事件 函式 到乙個佇列中去就可以用這個函式哦!示例 import bisect list 10,20,30 bisect.insort list,25 bisect.insort list,15 print list 輸出 10,15,20,25,30 哦!一切都明白了。說明白一...
二分插入排序
基本思想 1.取arr 1 為關鍵字key,將key插入前面已拍好的序列中。2.取arr 2 為關鍵字key,將key插入前面已拍好的序列中。3.取arr n 1 為關鍵字key,將key插入前面已拍好的序列中。include include define n 10 void binsertsort...