剑指 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 @   Garrett_Wale  阅读(62)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示