每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的:首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m-1的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮物,並且不再回到圈中,從他的下乙個小朋友開始,繼續0…m-1報數…這樣下去…直到剩下最後乙個小朋友,可以不用表演,並且拿到牛客名貴的「名偵探柯南」典藏版(名額有限哦!!_)。請你試著想下,哪個小朋友會得到這份禮品呢?(注:小朋友的編號是從0到n-1)
如果沒有小朋友,請返回-1
簡化的約瑟夫環問題。
思路一:使用陣列模擬遊戲
採用標記陣列的方法,用乙個陣列標記所有小朋友的狀態。每次數了m個小朋友以後就標記乙個小朋友。這樣迴圈知道標記了n個小朋友。返回最後乙個標記的小朋友的序號。
這種方法每次需要訪問陣列中每個元素,代價較大。
思路二:使用list模擬鍊錶
使用list存每個小朋友的序號。直接根據取模運算算出來每次應該去除掉第幾個元素,直接移除。最終剩下的乙個元素就是答案。
思路三:找規律
這個規律是看了別人的分析發現的。
我們注意到原問題僅僅是要求出最後的勝利者的序號,而不是要讀者模擬整個過程。因此如果要追求效率,就要打破常規,實施一點數學策略。
為了討論方便,先把問題稍微改變一下,並不影響原意:
問題描述:n個人(編號0~(n-1)),從0開始報數,報到(m-1)的退出,剩下的人繼續從0開始報數。求勝利者的編號。
我們知道第乙個人(編號一定是**(m - 1)% n**-- 不理解的可以自己試一下,反正一定是取餘操作) 出列之後,剩下的n-1個人組成了乙個新的約瑟夫環(以編號為k = (m - 1)%n的人開始):
** k+1 k+2 … n-2, n-1, 0, 1, 2, … k-2, k - 1**
並且從k開始報0。
下面把(k+1 k+2 … n-2, n-1, 0, 1, 2, … k-2, k - 1)轉換為(0~n-2)的形式,即:
k + 1 --> 0
k + 2 --> 1
k + 3 --> 2……
k - 2 --> n-3
k - 1 --> n-2
變換後就完完全全成為了(n-1)個人報數的子問題。
假如我們知道這個子問題(n - 1個人)的解:例如x是最終的勝利者,那麼根據上面這個表把這個x變回去剛好就是n個人情況的解嗎!!
變回去的公式很簡單,相信大家都可以推出來:x』=(x + k + 1)%n
如何知道(n-1)個人報數的問題的解?對,只要知道(n-2)個人的解就行了。(n-2)個人的解呢?當然是先求(n-3)的情況 ---- 這顯然就是乙個倒推問題!好了,思路出來了,下面寫遞推公式:
令f[i]表示i個人玩遊戲報m退出最後勝利者的編號,最後的結果自然是f[n]
遞推公式
f[1]=0;
f[i]=(f[i-1]+ k + 1)%n = (f[i-1]+ (m - 1)%n + 1)%n = (f[i-1]+ m - 1 + 1 + n)%n = (f[i-1]+ m)%n; (i>1)
有了這個公式,我們要做的就是從1-n順序算出f[i]的數值,最後結果是f[n]。
思路一:
public
intlastremaining_solution
(int n,
int m)
count =-1
;}}}
思路二:
public
intlastremaining_solution_v2
(int n,
int m)
int index =0;
while
(students.
size()
>1)
return students.
get(0)
;}
劍指offer 孩子們的遊戲
每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的 首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m 1的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮...
劍指 offer 孩子們的遊戲
每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的 首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m 1的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮...
劍指Offer 孩子們的遊戲
題目描述 每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的 首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m 1的那個小朋友要出列唱首歌,然後可以在禮品箱中任...