劍指Offer 面試題45 圓圈中最後剩下的數字

2021-08-20 03:56:56 字數 1018 閱讀 1614

題目:0,1,…,n-1這n個數字排成乙個圓圈,從數字0開始每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。

思路:下面,我們主要介紹,用動態規劃來解決問題的方式。

1、首先,我們定義乙個關於n、m的方程:f(n,m),該方程表示在n個數字中每次刪除第m個數字最後剩下的數字

根據1中的定義,我們可知 f(n-1,m)表示在n-1個數字中每次刪除第m個數字最後剩下的數字。那麼f(n,m) 與 f(n-1,m) 有什麼關係呢?

我們可以想到在n個數字中刪除第m個數字後,那麼n個數字就變成了n-1個數字,只是這n-1個數字是從 m , m+1…n-1, 0, 1,…m-2。於是,我們就想可不可以將 f(n,m) 在刪除第m個數字後,進行對映,將上述對映成

2、於是,我們構建乙個對映,將對映成,很容易想到p(x) = (x-m)%n,那麼該對映的逆對映就是(x+m)%n

3、於是,就將 f(n,m) = [ f(n-1,m) + m ] % n (n>1),當n=1時,f(n,m)=f(n-1,m)=0,聯絡起來,即遞迴式寫出來了

/*

思路:利用動態規劃,找出f(n,m)與f(n,m-1)的遞推關係,然後程式設計即可

f(n,m)的值表示n個數字中每次刪除第m個數字,刪除第m個數字後,從m+1開始計數,最終剩下的那個數字

*/class

solution

if(n==1)

return (lastremaining_solution(n-1,m) + m ) % n;}/*

這是迴圈的做法

*/int lastremaining_solution(int n, int m)

if(n==1)

int remainnumber=0;

for(int i=2;i<=n;i++)

return remainnumber;

}};

劍指Offer 面試題45 圓圈中最後剩下的數字

圓圈中最後剩下的數字 0,1,n 1這n個數字排成乙個圓圈,從數字0開始每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡 剩下的最後乙個數字。這是c語言書上的一道題目 設定乙個剪枝陣列,設定乙個迴圈,迴圈出口是只剩乙個元素,剛開始置剩餘元素總數目為n,後面會更新。注意每次當計數器變數走到n時,表明乙個...

劍指offer 面試題62 圓圈中最後剩下的數字

面試題 劍指offer 題目解答 0,1,n 1這n個數字排成乙個圈,從數字0開始,每次從這個圓圈裡刪除第m個數字,求這個圓圈裡剩下的最後乙個數字。書中給出了乙個經典的環形鍊錶的解題方法,但是在n數字較大的時候,你會發現,再環中的很多數字都會被多次重複遍歷,並且需要乙個輔助鍊錶來進行操作。所以,使用...

劍指offer 面試題62 圓圈中最後剩下的數字

問題 0,1,n 1這n個數字排成乙個圓圈,從數字0開始,每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。例如,0 1 2 3 4這5個數字組成乙個圓圈,從數字0開始每次刪除第3個數字,則刪除的前4個數字依次是2 0 4 1,因此最後剩下的數字是3。思路1 環形鍊錶模擬圓圈 複雜度...