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

2021-10-04 10:13:22 字數 2586 閱讀 5208

面試題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.合理...