日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

剑指offer:约瑟夫环的问题

發(fā)布時(shí)間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指offer:约瑟夫环的问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是約瑟夫環(huán)問題?

約瑟夫問題是個(gè)著名的問題:N個(gè)人圍成一圈,第一個(gè)人從1開始報(bào)數(shù),報(bào)M的將被殺掉,下一個(gè)人接著從1開始報(bào)。如此反復(fù),最后剩下一個(gè),求最后的勝利者。
例如只有三個(gè)人,把他們叫做A、B、C,他們圍成一圈,從A開始報(bào)數(shù),假設(shè)報(bào)2的人被殺掉。

  • 首先A開始報(bào)數(shù),他報(bào)1。僥幸逃過一劫。
  • 然后輪到B報(bào)數(shù),他報(bào)2。非常慘,他被殺了
  • C接著從1開始報(bào)數(shù)
  • 接著輪到A報(bào)數(shù),他報(bào)2。也被殺死了。
  • 最終勝利者是C

解決約瑟夫環(huán)問題,我們首先來分析一下!

1)普通解法

剛學(xué)數(shù)據(jù)結(jié)構(gòu)的時(shí)候,我們可能用鏈表的方法去模擬這個(gè)過程,N個(gè)人看作是N個(gè)鏈表節(jié)點(diǎn),節(jié)點(diǎn)1指向節(jié)點(diǎn)2,節(jié)點(diǎn)2指向節(jié)點(diǎn)3,……,節(jié)點(diǎn)N-1指向節(jié)點(diǎn)N,節(jié)點(diǎn)N指向節(jié)點(diǎn)1,這樣就形成了一個(gè)環(huán)。然后從節(jié)點(diǎn)1開始1、2、3……往下報(bào)數(shù),每報(bào)到M,就把那個(gè)節(jié)點(diǎn)從環(huán)上刪除。下一個(gè)節(jié)點(diǎn)接著從1開始報(bào)數(shù)。最終鏈表僅剩一個(gè)節(jié)點(diǎn)。它就是最終的勝利者。

缺點(diǎn):

要模擬整個(gè)游戲過程,時(shí)間復(fù)雜度高達(dá)O(nm),當(dāng)n,m非常大(例如上百萬,上千萬)的時(shí)候,幾乎是沒有辦法在短時(shí)間內(nèi)出結(jié)果的。


2)公式法

約瑟夫環(huán)是一個(gè)經(jīng)典的數(shù)學(xué)問題,我們不難發(fā)現(xiàn)這樣的依次報(bào)數(shù),似乎有規(guī)律可循。為了方便導(dǎo)出遞推式,我們重新定義一下題目。
問題: N個(gè)人編號(hào)為1,2,……,N,依次報(bào)數(shù),每報(bào)到M時(shí),殺掉那個(gè)人,求最后勝利者的編號(hào)。

這邊我們先把結(jié)論拋出了。之后帶領(lǐng)大家一步一步的理解這個(gè)公式是什么來的。
遞推公式:

?

f(N,M)=(f(N?1,M)+M)%N?f(N,M)=(f(N?1,M)+M)%N

?

  • f(N,M)?f(N,M) 表示,N個(gè)人報(bào)數(shù),每報(bào)到M時(shí)殺掉那個(gè)人,最終勝利者的編號(hào)
  • f(N?1,M)?f(N?1,M) 表示,N-1個(gè)人報(bào)數(shù),每報(bào)到M時(shí)殺掉那個(gè)人,最終勝利者的編號(hào)

下面我們不用字母表示每一個(gè)人,而用數(shù)字。

1、2、3、4、5、6、7、8、9、10、11?1、2、3、4、5、6、7、8、9、10、11


表示11個(gè)人,他們先排成一排,假設(shè)每報(bào)到3的人被殺掉。

  • 剛開始時(shí),頭一個(gè)人編號(hào)是1,從他開始報(bào)數(shù),第一輪被殺掉的是編號(hào)3的人。
  • 編號(hào)4的人從1開始重新報(bào)數(shù),這時(shí)候我們可以認(rèn)為編號(hào)4這個(gè)人是隊(duì)伍的頭。第二輪被殺掉的是編號(hào)6的人。
  • 編號(hào)7的人開始重新報(bào)數(shù),這時(shí)候我們可以認(rèn)為編號(hào)7這個(gè)人是隊(duì)伍的頭。第三輪被殺掉的是編號(hào)9的人。
  • ……
  • 第九輪時(shí),編號(hào)2的人開始重新報(bào)數(shù),這時(shí)候我們可以認(rèn)為編號(hào)2這個(gè)人是隊(duì)伍的頭。這輪被殺掉的是編號(hào)8的人。
  • 下一個(gè)人還是編號(hào)為2的人,他從1開始報(bào)數(shù),不幸的是他在這輪被殺掉了。
  • 最后的勝利者是編號(hào)為7的人。

下圖表示這一過程(先忽視綠色的一行)

現(xiàn)在再來看我們遞推公式是怎么得到的!
將上面表格的每一行看成數(shù)組,這個(gè)公式描述的是:幸存者在這一輪的下標(biāo)位置

  • f(1,3)?f(1,3) :只有1個(gè)人了,那個(gè)人就是獲勝者,他的下標(biāo)位置是0
  • f(2,3)=(f(1,3)+3)%2=3%2=1?f(2,3)=(f(1,3)+3)%2=3%2=1 :在有2個(gè)人的時(shí)候,勝利者的下標(biāo)位置為1
  • f(3,3)=(f(2,3)+3)%3=4%3=1?f(3,3)=(f(2,3)+3)%3=4%3=1 :在有3個(gè)人的時(shí)候,勝利者的下標(biāo)位置為1
  • f(4,3)=(f(3,3)+3)%4=4%4=0?f(4,3)=(f(3,3)+3)%4=4%4=0 :在有4個(gè)人的時(shí)候,勝利者的下標(biāo)位置為0
  • ……
  • f(11,3)=6?f(11,3)=6

很神奇吧!現(xiàn)在你還懷疑這個(gè)公式的正確性嗎?上面這個(gè)例子驗(yàn)證了這個(gè)遞推公式的確可以計(jì)算出勝利者的下標(biāo),下面將講解怎么推導(dǎo)這個(gè)公式。
問題1:假設(shè)我們已經(jīng)知道11個(gè)人時(shí),勝利者的下標(biāo)位置為6。那下一輪10個(gè)人時(shí),勝利者的下標(biāo)位置為多少?
答:其實(shí)吧,第一輪刪掉編號(hào)為3的人后,之后的人都往前面移動(dòng)了3位,勝利這也往前移動(dòng)了3位,所以他的下標(biāo)位置由6變成3。

問題2:假設(shè)我們已經(jīng)知道10個(gè)人時(shí),勝利者的下標(biāo)位置為3。那下一輪11個(gè)人時(shí),勝利者的下標(biāo)位置為多少?
答:這可以看錯(cuò)是上一個(gè)問題的逆過程,大家都往后移動(dòng)3位,所以f(11,3)=f(10,3)+3?f(11,3)=f(10,3)+3 。不過有可能數(shù)組會(huì)越界,所以最后模上當(dāng)前人數(shù)的個(gè)數(shù),f(11,3)=(f(10,3)+3)%11?f(11,3)=(f(10,3)+3)%11

問題3:現(xiàn)在改為人數(shù)改為N,報(bào)到M時(shí),把那個(gè)人殺掉,那么數(shù)組是怎么移動(dòng)的?
答:每殺掉一個(gè)人,下一個(gè)人成為頭,相當(dāng)于把數(shù)組向前移動(dòng)M位。若已知N-1個(gè)人時(shí),勝利者的下標(biāo)位置位f(N?1,M)?f(N?1,M) ,則N個(gè)人的時(shí)候,就是往后移動(dòng)M為,(因?yàn)橛锌赡軘?shù)組越界,超過的部分會(huì)被接到頭上,所以還要模N),既f(N,M)=(f(N?1,M)+M)%n?f(N,M)=(f(N?1,M)+M)%n

注:理解這個(gè)遞推式的核心在于關(guān)注勝利者的下標(biāo)位置是怎么變的。每殺掉一個(gè)人,其實(shí)就是把這個(gè)數(shù)組向前移動(dòng)了M位。然后逆過來,就可以得到這個(gè)遞推式。

因?yàn)榍蟪龅慕Y(jié)果是數(shù)組中的下標(biāo),最終的編號(hào)還要加1。


劍指offer題目:每年六一兒童節(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)

拿到這一題,對(duì)比上面的兩種思路:

1)使用數(shù)組模仿一個(gè)環(huán)。

2)使用公式遞歸求解。


首先看第一種思路:

class Solution { public:int LastRemaining_Solution(unsigned int n, unsigned int m){/*每輪被select的數(shù)被設(shè)置成-1;超出數(shù)組范圍的,回到數(shù)組起點(diǎn),模仿一個(gè)環(huán);每次再次走到之前select的數(shù)的時(shí)候,就continue;*///if(n<1||m<1) return -1;int* array = new int[n];int i = -1, step = 0, count = n;while(count>0){i++;if(i>=n) i = 0;//模仿一個(gè)環(huán)if(array[i]==-1) continue;//每次再走到之前select的數(shù)時(shí),就continue;step++;if(step == m){array[i] = -1; //每輪被select的數(shù)被設(shè)置成-1;step = 0;count--;}}return i; //此題小朋友的編號(hào)是從0到n-1} };

再看第二種思路:

class Solution { public:int LastRemaining_Solution(unsigned int n, unsigned int m){if(n==0)return -1;if(n==1)return 0;elsereturn (LastRemaining_Solution(n-1,m)+m)%n;} };

?

總結(jié)

以上是生活随笔為你收集整理的剑指offer:约瑟夫环的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲4区| 爽妇网国产精品 | 90岁肥老奶奶毛毛外套 | 亚洲欧美成人 | 精品一区二三区 | 婷婷亚洲综合 | 亚洲精品66 | 欧美日本黄色 | 啪在线视频 | 中文精品视频 | 91亚洲精品久久久蜜桃网站 | 久久久久久久久久一区 | 国产亚洲久一区二区 | 青娱乐91视频 | 国产99免费视频 | 黄色一极毛片 | 清纯唯美亚洲激情 | 国产一级二级三级在线 | 国产第一页屁屁影院 | www.久久av.com| 国产a视频精品免费观看 | 亚洲乱码国产乱码精品天美传媒 | 国产又黄又爽视频 | 免费黄色的网站 | 十大黄台在线观看 | 久久久久久不卡 | 女女h百合无遮羞羞漫画软件 | 日韩视频精品在线 | www色婷婷| 国产免费看黄 | 在线免费av网 | 色婷婷国产精品久久包臀 | 亚洲熟区| 国产高清免费在线 | 国产剧情av在线播放 | 亚洲成人精品一区二区 | 亚洲区色 | 亚洲狠狠婷婷综合久久久久图片 | 成人做爰视频www | 蜜臀久久99精品久久久久宅男 | 国产免费一区二区三区视频 | 在线观看的av网站 | 亚洲制服另类 | 国产爱搞 | 日日摸夜夜添狠狠添久久精品成人 | www.夜夜爽 | 国产一二三精品 | 久久久香蕉网 | 久久久久香蕉 | aaaaa级片| 成人短视频在线播放 | 中文字幕在线观看网址 | 精品久久成人 | 美女100%露胸无遮挡 | 操碰av | 亚洲精品电影在线观看 | 亚洲毛片在线看 | 男人天堂tv | 四虎影| 亚洲精品国产91 | 97人人超| 男生和女生靠逼视频 | 九色porny自拍视频在线播放 | 制服丝袜第二页 | 揄拍成人国产精品视频 | 爱操视频| 巨胸爆乳美女露双奶头挤奶 | 日韩一页 | 激情第四色 | 精品欧美黑人一区二区三区 | 精品中文一区二区三区 | 午夜影院免费体验区 | av大全免费观看 | 久久久久久久久国产 | 久久成人精品 | 国产精品久久久久三级无码 | av网址在线看 | 岛国a视频| 漂亮少妇高潮午夜精品 | 懂色aⅴ国产一区二区三区 亚洲欧美国产另类 | 成人美女在线观看 | 久久久久久91亚洲精品中文字幕 | 成人在线免费小视频 | 成人国产精品免费观看 | 95精品视频| 成人国产精品免费观看动漫 | 先锋影视av| 欧美精品色哟哟 | 天天干天天干 | 久草小说 | 日本在线激情 | 国产亚洲综合av | 成人必看www.| 91视频最新入口 | 色91| 波多野结衣中文字幕一区 | 波多野结衣乳巨码无在线 | 日日人人 | 69亚洲精品久久久蜜桃小说 |