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

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

Offer_62

题目描述

方法一:使用链表模拟

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

方法二:递归方法

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;
    }
}

方法三:数学迭代方法

/**
 * 方法二:使用迭代
 */
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;
    }

}
posted @ 2021-02-13 23:29  Garrett_Wale  阅读(61)  评论(0编辑  收藏  举报