- 論壇徽章:
- 0
|
原帖由 emacsnw 于 12/29/06 13:35 發(fā)表
這個(gè)有點(diǎn)意思,不妨說來聽聽,呵呵。
就是首先, 問題的最優(yōu)解等于序列中元素的最大重復(fù)數(shù), 這個(gè)容易證明.
然后我們考慮下面這個(gè)簡(jiǎn)單的情形:
不嚴(yán)格的說:
我們每次只需要把這個(gè)形狀的天空線, 打印出來就行了
打印出來的值就刪掉, 比如輸出一個(gè)子序列后變成下面這樣:
要實(shí)現(xiàn)這個(gè),
我們維護(hù)一個(gè)鏈表, 這個(gè)鏈表就是當(dāng)前這次掃描應(yīng)該輸出序列(不好意思...要描述還真是e...)
鏈表用Pi表示.
比如初始的時(shí)候P1=4, P4=5, P5=7, P7=8, P8=-1
然后每次輸出元素的時(shí)候維護(hù)這個(gè)指針序列就行了, 檢查一下是否對(duì)應(yīng)的值已經(jīng)用完, 沒完就加1, 完了就推進(jìn), 相當(dāng)于從鏈表中刪掉結(jié)點(diǎn), 設(shè)當(dāng)前待輸出子序列長度為k, 維護(hù)復(fù)雜度是O(k)的
由于每個(gè)元素最多被刪一次, 用平攤分析可以得到輸出完成的復(fù)雜度是O(n)
還可以添加一個(gè)在0位置的頭元素, P0始終指向鏈表頭, 方便統(tǒng)一處理.
而且初始的Pi可以在O(n)里完成
就是基于上面的算法, 可以看到Pi有界, 在[-1,n]中, 我們把小數(shù)部分分成[n+2]段, 就可以附加保存Pi了...
不考慮浮點(diǎn)誤差的話...應(yīng)該可以這樣...
BTW: 如果直接打印也算輔助空間的話...暫時(shí)沒轍了
cheat啊~~
Please correct me if I'm wrong. |
|