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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【剑指offer】_13 圆圈中最后的数

發(fā)布時(shí)間:2023/11/30 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【剑指offer】_13 圆圈中最后的数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目描述

年六一兒童節(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)容,希望文章能夠幫你解決所遇到的問題。

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