題目: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 環形鍊錶模擬圓圈 複雜度...