本文主要是介绍剑指 Offer 62. 圆圈中最后剩下的数字(约瑟夫环问题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、题目:
0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
其实这就是约瑟夫环问题:
这个问题是以弗拉维奥·约瑟夫命名的,他是1世纪的一名犹太历史学家。他在自己的日记中写道,他和他的40个战友被罗马军队包围在洞中。他们讨论是自杀还是被俘,最终决定自杀,并以抽签的方式决定谁杀掉谁。约瑟夫斯和另外一个人是最后两个留下的人。约瑟夫斯说服了那个人,他们将向罗马军队投降,不再自杀。约瑟夫斯把他的存活归因于运气或天意,他不知道是哪一个。
—— 【约瑟夫问题】维基百科
二、思路和代码
我的理解就是删除第m个,然后将m前面的人排到后面去,再次继续上述,直到剩下最后一个人。
class Solution {
public:int lastRemaining(int n, int m) {int res=0;// 最后一轮剩下2个人,所以从2开始反推for(int i=2;i<=n;i++){res=(res+m)%i;}return res;}
};
ps:本文思想来自甜姨的思路
怕什么真理无穷,进一步有进一步的欢喜!
这篇关于剑指 Offer 62. 圆圈中最后剩下的数字(约瑟夫环问题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!