面試題62:0,1,n-1這n個數字排成乙個圓圈,從數字0開始,每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。
例如,0、1、2、3、4這5個數字組成乙個圓圈,從數字0開始每次刪除第3個數字,則刪除的前4個數字依次是2、0、4、1,因此最後剩下的數字是3。
示例 1:
輸入: n = 5, m = 3
輸出: 3
示例 2:
輸入: n = 10, m = 17
輸出: 2
限制:1 <= n <= 10^5
1 <= m <= 10^6
約瑟夫環問題:
使用list模擬迴圈鍊錶,用cur作為指向list的下標位置。
當cur移到list末尾直接指向list頭部,當刪除乙個數後list的長度和cur的值相等則cur指向0
leecode超時,牛客通過
/*
struct listnode
*/class
solution
//構建第m個迭代器的下乙個迭代器
list<
int>
::iterator next =
++current;
if(next == nums.
end())
next = nums.
begin()
;--current;
//whlie中每次真正做的事情
nums.
erase
(current)
; current = next;
//迴圈變數
}return
*current;
//返回最後剩下的數}}
;
參考
使用動態規劃。我們注意到,輸入的序列在刪除乙個元素後,序列的長度會改變,如果索引
在被刪除的元素位置開始計算,那麼每刪除乙個元素,序列的長度減一而索引會完全改變。
如果能找到改變前的索引和新索引的對應關係,那麼該問題就容易解決了。
我們定義乙個函式f(n, m),表示每次在n個數字0,1,2,3,…,n-1中每次刪除第m個數字後剩下
的數字。那麼第乙個被刪除的數字的索引是(m-1)%n。刪除該索引元素後,剩下的n-1個數字
為0,1,2,…,k-1,k+1,…,n-1。下次刪除數字是從k+1位置開始,於是可以把序列看
作k+1,…,n-1,0,1,…,k-1。該序列最後剩下的序列也是f的函式。但該函式和第乙個函式
不同,存在對映關係,使用f』來表示,於是有:f(n, m)=f』(n-1, m)。接下來需要找到對映關係。
k+1 --> 0
k+2 --> 1..
.n-1 --> n-k-2
0 --> n-k-1..
.k-1 --> n-2
所以可以得到:right = left-k-1,則p(x) = (x-k-1)%n,而逆對映是p』(x) = (x+k+1)%n
即0 ~ n-1序列中最後剩下的數字等於(0~n-2序列中最後剩下的數字+k)%n,很明顯當n=1時,
只有乙個數,那麼剩下的數字就是0.問題轉化為動態規劃問題,關係表示為:
f(n)=(f(n-1)+m)%n; 當n=1,f(1)=0;
數學歸納法證明:
遞推公式:f(n,m)=[f(n-1,m)+m]%n,其中f(i,j)表示當問題規模為i,報數長度為j時最後勝利者的編號。
證明:使用數學歸納法進行證明。
當n=1時,f(1,m)=0,因為編號從0開始且只有乙個人,勝利者編號顯然為0。
當n=2時,序列為0,1,若m為奇數,則勝利者編號為1;若m為偶數,則勝利者編號為0,易有f(2,m)=m%2=(0+m)%2=[f(1,m)+m]%2,結論成立。
假設當n=i-1時結論成立,即對於序列0,1,2,…,i-2而言,最後的勝利者編號為f(i-1,m)。
當n=i時,序列為0,1,2,…,i-1。設第一輪的淘汰者編號為k(若m%i=0,則k=i-1,否則k=m%i-1),則序列可表示為0,1,2,…,k-1,k,k+1,…,i-1。第一輪淘汰k,餘下的序列x』為k+1,…,i-1,0,1,…,k-1,問題規模變為i-1。
因為由歸納假設,當n=i-1時,對於序列x:0,1,2,…,f(i-1,m),…,i-2,勝利者編號為f(i-1,m)。由於x』=(x+k+1)%i,故f(i,m)=[f(i-1,m)+k+1]%i。當m%i=0時,k+1=i,[f(i-1,m)+k+1]%i=[f(i-1,m)+i]%i=f(i-1,m)%i+0=f(i-1,m)%i+m%i=[f(i-1,m)+m]%i;當m%i!=0時,k+1=m%i,[f(i-1,m)+k+1]%i=[f(i-1,m)+m%i]%i=[f(i-1,m)+m]%i。故當n=i時,結論成立。
綜上,命題成立。
感想:因為當n=i-1時,對於序列x:0,1,2,…,f(i-1,m),…,i-2,勝利者編號為f(i-1,m)。對於問題規模為i時,經過第一輪淘汰,得到序列x』。只要能夠發現x與x』間的對應關係,由f(i-1,m)就能得到f(i,m)。
class
solution
};
面試題62 圓圈中最後剩下的數字
1.題目描述 0,1,n 1這n個數字排成乙個圓圈,從數字0開始,每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。例如,0 1 2 3 4這5個數字組成乙個圓圈,從數字0開始每次刪除第3個數字,則刪除的前4個數字依次是2 0 4 1,因此最後剩下的數字是3。示例 示例 1 輸入 n...
面試題62 圓圈中最後剩下的數字
題目 0,1,n 1這n個數字排成乙個圓圈,從數字0開始,每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。例如,0 1 2 3 4這5個數字組成乙個圓圈,從數字0開始每次刪除第3個數字,則刪除的前4個數字依次是2 0 4 1,因此最後剩下的數字是3。示例 1 輸入 n 5,m 3 ...
面試題62 圓圈中最後剩下的數字
1.重新理解題目 感覺題目對過程的描述不清楚,我們重新來理解題目 n個人站成一圓圈,編號分別為1 2 n,從編號1的人開始報數1,2,報到m時,這個報m的人出列 再從出列人的後一人開始重新報數1,2,報到m時,再出列 求佇列只剩1人時該人的編號。2.一行 解決 class solution 3.合理...