【剑指offer】_13 圆圈中最后的数
題目描述
年六一兒童節(jié),牛客都會(huì)準(zhǔn)備一些小禮物去看望孤兒院的小朋友,今年亦是如此。HF作為牛客的資深元老,自然也準(zhǔn)備了一些小游戲。其中,有個(gè)游戲是這樣的:首先,讓小朋友們圍成一個(gè)大圈。然后,他隨機(jī)指定一個(gè)數(shù)m,讓編號(hào)為0的小朋友開始報(bào)數(shù)。每次喊到m-1的那個(gè)小朋友要出列唱首歌,然后可以在禮品箱中任意的挑選禮物,并且不再回到圈中,從他的下一個(gè)小朋友開始,繼續(xù)0…m-1報(bào)數(shù)…這樣下去…直到剩下最后一個(gè)小朋友,可以不用表演,并且拿到牛客名貴的“名偵探柯南”典藏版(名額有限哦!!_)。請(qǐng)你試著想下,哪個(gè)小朋友會(huì)得到這份禮品呢?(注:小朋友的編號(hào)是從0到n-1)
如果沒有小朋友,請(qǐng)返回-1
解題思路
我們注意到,輸入的序列在刪除一個(gè)元素后,序列的長度會(huì)改變,如果索引(數(shù)組下標(biāo))
在被刪除的元素位置開始計(jì)算,那么每刪除一個(gè)元素,序列的長度減一而索引會(huì)完全改變。
如果能找到改變前的索引和新索引的對(duì)應(yīng)關(guān)系,那么該問題就容易解決了。
我們定義一個(gè)函數(shù)f(n, m),表示每次在n個(gè)數(shù)字0,1,2,3,…,n-1中每次刪除第m個(gè)數(shù)字后剩下
的數(shù)字。那么第一個(gè)被刪除的數(shù)字的索引是(m-1)%n(例如一共有10個(gè)孩子,第五個(gè)走,那么走的孩子在數(shù)組中的下標(biāo)為(5-1)%10=4)。
刪除該索引元素后,剩下的n-1個(gè)數(shù)字
為0,1,2,…,k-1,k+1,…,n-1。下次刪除數(shù)字是從k+1位置開始,于是可以把序列看作k+1,..,n-1,0,1,…,k-1。該序列最后剩下的序列也是f的函數(shù)。但該函數(shù)和第一個(gè)函數(shù)不同,存在映射關(guān)系,使用f’來表示,于是有:f(n, m)=f’(n-1, m)。接下來需要找到映射關(guān)系。
給出一個(gè)序列,從0~n-1編號(hào)。其中,k代表出列的序號(hào)的下一個(gè),即k-1出列。
a 0, 1, …, k-1, k, k+1, …, n-1
那么,出列的序號(hào)是(m-1)%n,k=m%n(這個(gè)可真的是顯而易見)。出列k-1后,序列變?yōu)?/p>
b 0, 1, …, k-2, k, k+1, …, n-1
然后,我們繼續(xù)從n-1后延長這個(gè)序列,可以得到
c’ 0, 1, …, k-2, k, k+1, …, n-1, n, n+1, …, n+k-2
我們?nèi)膋開始直到n+k-2這段序列。其實(shí)這段序列可以看作將序列b的0~k-2段移到了b序列的后面。這樣,得到一個(gè)新的序列
c k, k+1, …, n-1, n, n+1, …, n+k-2
好了,整個(gè)序列c都減除一個(gè)k,得到
d 0, 1, …, n-2
c序列中的n-1, n, n+1都減除個(gè)k是什么?這個(gè)不需要關(guān)心,反正c序列是連續(xù)的,我們知道了頭和尾,就能知道d序列是什么樣的。
這樣你看,從序列a到序列d,就是一個(gè)n序列到n-1序列的變化,約瑟夫環(huán)可以通過遞推來獲得最終結(jié)果。ok,繼續(xù)向下。
剩下的就是根據(jù)n-1序列遞推到n序列。假設(shè)在n-1序列中,也就是序列d中,我們知道了最終剩下的一個(gè)序號(hào)是x
往回推
d->c,剛才是同時(shí)減了個(gè)k,這回再同時(shí)加個(gè)k,就是x+k;
c->b,(x+k)%n。%n以后。k ~ n-1這段序列值不會(huì)發(fā)生變化,而n~n+k-2這段序列則變成了0~k-2;這兩段序列合起來,就是序列b。
x=(x+k)%n。并且,k=m%n,所以x=(x+m%n)%n=(x+m)%n;
f[i]=(f[i-1]+m)%i
代碼實(shí)現(xiàn)
class Solution { public:int LastRemaining_Solution(int n, int m){if(n==0)return -1;if(n==1)return 0;return (LastRemaining_Solution(n-1,m)+m)%n;} };總結(jié)
以上是生活随笔為你收集整理的【剑指offer】_13 圆圈中最后的数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都大熊猫繁育基地免票政策
- 下一篇: 【剑指offer】_14 不用加减乘除做