新聞中心
兩個單鏈表(singly linked list),每一個節(jié)點里面一個0-9的數字,輸入就相當于兩個大數了。然后返回這兩個數的和(一個新list)。這兩個輸入的list長度相等。

尼河口ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
要求是:
- 不用遞歸;
- 要求算法在最好的情況下,只遍歷兩個list一次 ,最差的情況下兩遍。
關于??菔癄€的分析:
原題:兩個玩家,一堆石頭,假設多于100塊,兩人依次拿,最后拿光者贏,規(guī)則是:
- 第一個人不能一次拿光所有的;
- 第一次拿了之后, 每人每次最多只能拿對方前一次拿的數目的兩倍。求先拿者必勝策略, 如果有的話。怎么證明必勝。
分析:
這是斐波那契博弈,當且僅當石頭個數是斐波那契數的時候先手必敗。
讓我們用第二數學歸納法證明:
為了方便,我們將 n 記為 f[i] 。
1、當 i=2 時,因為不能全部去完,先手只能取1顆,顯然必敗,結論成立。
2、假設當 i<=k 時,結論成立。
則當 i=k+1 時,f[i] = f[k]+f[k-1]。
則我們可以把這一堆石子看成兩堆,簡稱 k 堆和 k-1 堆。
(一定可以看成兩堆,因為假如先手第一次取的石子數大于或等于f[k-1],則后手可以直接取完 f[k] ,因為 f[k] < 2*f[k-1] )
對于 k-1 堆,由假設可知,不論先手怎樣取,后手總能取到最后一顆。下面我們分析一下后手最后取的石子數 x 的情況。
如果先手第一次取的石子數 y>=f[k-1]/3 ,則這小堆所剩的石子數小于 2y ,即后手可以直接取完,此時 x=f[k-1]-y ,則 x<=2/3*f[k-1] 。
我們來比較一下 2/3*f[k-1] 與 1/2*f[k] 的大小。即 4*f[k-1] 與 3*f[k] 的大小,對兩值作差后不難得出,后者大。
所以我們得到,x<1/2*f[k] 。
即后手取完 k-1 堆后,先手不能一下取完 k 堆,所以游戲規(guī)則沒有改變,則由假設可知,對于 k 堆,后手仍能取到最后一顆,所以后手必勝。
即 i=k+1 時,結論依然成立。
那么,當 n 不是Fibonacci數的時候,情況又是怎樣的呢?
這里需要借助“Zeckendorf定理”(齊肯多夫定理):任何正整數可以表示為若干個不連續(xù)的Fibonacci數之和。
關于這個定理的證明,感興趣的同學可以在網上搜索相關資料,這里不再詳述。
分解的時候,要取盡量大的Fibonacci數。
比如分解85:85在55和89之間,于是可以寫成85=55+30,然后繼續(xù)分解30,30在21和34之間,所以可以寫成30=21+9,
依此類推,最后分解成85=55+21+8+1。
則我們可以把 n 寫成 n = f[a1]+f[a2]+……+f[ap] 。(a1>a2>……>ap)
我們令先手先取完 f[ap] ,即最小的這一堆。由于各個f之間不連續(xù),則 a(p-1) > ap + 1 ,則有 f[a(p-1)] > 2*f[ap]。即后手只能取 f[a(p-1)] 這一堆,且不能一次取完。
此時后手相當于面臨這個子游戲(只有 f[a(p-1)]這一堆石子,且后手先?。┑谋財B(tài),即先手一定可以取到這一堆的最后一顆石子。
同理可知,對于以后的每一堆,先手都可以取到這一堆的最后一顆石子,從而獲得游戲的勝利。
參考博文:斐波那契博弈
當前名稱:單鏈表和之戀和??菔癄€題之分析
新聞來源:http://www.dlmjj.cn/article/djsodjs.html


咨詢
建站咨詢
