约瑟夫环问题

简介: 约瑟夫环问题

@TOC


约瑟夫环问题

约瑟夫环问题
给定一个链表头节点head,和一个正数m
从头开始,每次数到m就杀死当前节点
然后被杀节点的下一个节点从1开始重新数,
周而复始直到只剩一个节点,返回最后的节点

思路

先解决一个问题:
编号和报数之间的关系

在这里插入图片描述
在这里插入图片描述
有abcd四个人,第一轮的编号是
a:1, b:2 , c:3 , d:4
当淘汰b之后
第二轮的编号就变成
a:3, d:2, c:1

剩一个点的时候存活节点在最后一步的编号中它是编号1
假设有一个公式,传入一个节点淘汰之后的编号,返回淘汰之前的编号
一直调用到一个节点也不淘汰的时候的编号就是幸存者编号
目标就是:推导一个F函数 告诉我淘汰之后的编号怎么对应出淘汰之前的编号

画图像

首先求出一个数字对应的编号
剃刀感觉的图像
在这里插入图片描述

在这里插入图片描述
根据函数图像的规则:左加右减,上加下减

推出 编号=(数-1)%i+1
给你一个数字报数它减1之后模上i再加1.就得到了它的编号

淘汰之后的编号怎么推淘汰之前的编号
假设i个节点淘汰报数到m的编号
用具体例子

在这里插入图片描述
在这里插入图片描述

抽象化


在这里插入图片描述
延长
限制死定义域

在这里插入图片描述
向左移动s位
在这里插入图片描述
s是长度i 链表中数到m淘汰人的编号

在这里插入图片描述
将刚才算出的编号函数套进去
在这里插入图片描述
最后化简到
前=(后+m-1)%i+1

力扣原题:剑指 Offer 62. 圆圈中最后剩下的数字

0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。

例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    public int lastRemaining(int n, int m) {
        return getLive(n,m)-1;
    }
    public int getLive(int n,int m){
        if(n==1){
            return 1;
        }
        return (getLive(n-1,m)+m-1)%n+1;
    }
}
//迭代
    public int lastRemaining(int n, int m) {
        int ans = 1;
        int r = 1;
        while (r <= n) {
            ans = (ans + m - 1) % (r++) + 1;
        }
        return ans - 1;
    }
相关文章
|
6月前
|
人工智能 缓存 自然语言处理
全球首款开源通用型AI智能体上线!Suna:自动处理Excel/爬数据/写报告等复杂任务一句话搞定
Suna是由Kortix推出的开源通用型AI智能体项目,通过自然语言交互实现浏览器自动化、文件管理、数据分析等复杂任务处理,支持自托管部署,为研究分析和日常工作提供智能辅助。
1382 55
全球首款开源通用型AI智能体上线!Suna:自动处理Excel/爬数据/写报告等复杂任务一句话搞定
|
7月前
|
安全 Java Linux
Websoft9:为开发者打造的高效 Linux 服务器面板
Websoft9 是一款以开源应用部署与管理为核心的服务器面板,采用“环境即服务”模式。它通过运行环境标准化、自动化配置、安全融合和资源管理四个方面实现平台与环境的深度协同。支持多语言框架预集成、云原生组件整合,提供 200+ 应用模板一键部署,并具备全流程安全防护和统一资源监控能力,助力开发者高效管理和扩展应用环境。
202 0
|
12月前
|
资源调度 Linux 调度
Linux C/C++之线程基础
这篇文章详细介绍了Linux下C/C++线程的基本概念、创建和管理线程的方法,以及线程同步的各种机制,并通过实例代码展示了线程同步技术的应用。
189 0
Linux C/C++之线程基础
|
编译器
html动态爱心代码【三】(附源码)
html动态爱心代码【三】(附源码)
896 0
|
JavaScript 前端开发 Shell
mac和windows上安装nvm管理node版本
NVM(Node Version Manager)是前端开发者常用的命令行工具,用于管理计算机上的不同Node.js版本。通过NVM,开发者可以轻松地在多个项目间切换所需的Node.js版本。在Mac上,可以通过cURL或Wget下载安装脚本,或使用包管理工具brew安装。安装后需配置环境变量以识别NVM命令。Windows用户则可通过专用的nvm-windows安装程序完成安装。常用命令包括安装、卸载特定版本、列出已安装版本等。
|
监控 安全 物联网
物联卡:物联网卡和SIM卡的不同
物联网卡(IoT SIM卡)和普通SIM卡在多个方面存在显著的差异,这些差异主要体现在应用场景、功能特点、资费结构、管理方式等方面。以下是它们之间区别的详细分析:
|
Unix Linux 应用服务中间件
【Linux】Linux 系统编程——相对路径和绝对路径
【Linux】Linux 系统编程——相对路径和绝对路径
544 1
|
运维 监控 Cloud Native
茶百道全链路可观测实战
茶百道全链路可观测实战
2052 126
|
运维 中间件 调度
【Alibaba中间件技术系列】「Nacos技术专题」配置中心加载原理和配置实时更新原理分析(中)
【Alibaba中间件技术系列】「Nacos技术专题」配置中心加载原理和配置实时更新原理分析(中)
523 74
【Alibaba中间件技术系列】「Nacos技术专题」配置中心加载原理和配置实时更新原理分析(中)
|
监控 容灾 安全
《云上容灾交付服务白皮书》——2.容灾技术架构——1.3 行业容灾现状分析(下)
《云上容灾交付服务白皮书》——2.容灾技术架构——1.3 行业容灾现状分析(下)
465 0