剑指 Offer 62. 圆圈中最后剩下的数字 + 约瑟夫环问题

时间:2023-03-09 08:37:45
剑指 Offer 62. 圆圈中最后剩下的数字 + 约瑟夫环问题

剑指 Offer 62. 圆圈中最后剩下的数字

Offer_62

题目描述

剑指 Offer 62. 圆圈中最后剩下的数字 + 约瑟夫环问题

方法一:使用链表模拟

  • 这种方法是暴力方法,时间复杂度为O(nm),在本题中数据量过大会超时。

方法二:递归方法

剑指 Offer 62. 圆圈中最后剩下的数字 + 约瑟夫环问题

package com.walegarrett.offer;
/**
* @Author WaleGarrett
* @Date 2021/2/13 12:17
*/ /**
* 题目详情:0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。
* 求出这个圆圈里剩下的最后一个数字。
* 例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
*/ /**
* 方法一:递归求解
*/
public class Offer_62 {
public int lastRemaining(int n, int m) { return dfs(n,m);
}
int dfs(int n, int m){
if(n==1)
return 0;
int x = dfs(n-1, m);
return (m+x)%n;
}
}

方法三:数学迭代方法

剑指 Offer 62. 圆圈中最后剩下的数字 + 约瑟夫环问题

/**
* 方法二:使用迭代
*/
class Offer_62_2 {
public int lastRemaining(int n, int m) {
int f=0;
for(int i=2;i!=n+1;i++){
f=(m+f)%i;
}
return f;
} }