约瑟夫环问题

简介: 力扣原题:剑指 Offer 62. 圆圈中最后剩下的数字0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3

文章目录

约瑟夫环问题

思路

画图像

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

约瑟夫环问题

约瑟夫环问题

给定一个链表头节点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;

   }

}

1

2

3

4

5

6

7

8

9

10

11

//迭代

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;

}


目录
相关文章
|
数据采集 API 开发者
快手商品数据采集接口
快手商品数据采集接口
|
小程序 API
微信小程序中音频播放
微信小程序中音频播放
484 0
|
JSON 前端开发 JavaScript
开源表单方案 Formily 的核心设计思路
Formily 是一个数据+协议驱动的表单解决方案,它站在Reactive响应式编程巨人的肩膀上,构建出了从基础表单到低代码领域的高性能通用基础能力,同时其配套的跨框架+跨终端组件生态体系,也能让用户更高效的开发日常业务表单,尽可能的减少了重复冗余的逻辑实现。本篇内容来自白玄在第十六届D2前端技术论坛的分享,将为你介绍如何在高复杂业务场景下提高我们的表单性能与表单开发效率。
5501 1
开源表单方案 Formily 的核心设计思路
|
8月前
|
自然语言处理 数据挖掘 API
淘宝直播间弹幕 API 接口(淘宝 API 系列)
淘宝直播间弹幕API助力电商直播数据分析与优化。通过实时获取弹幕信息(昵称、内容、时间、类型),商家可精准把握消费者需求,优化直播内容;开发者可构建数据分析工具和智能客服系统。接口采用WebSocket协议,支持全双工通信,确保数据实时性。请求需包含直播间ID(room_id),并遵循平台使用规范。示例代码展示了Python调用方法,需安装`websocket-client`库并处理重连与异常。
|
Java Maven
Maven配置阿里云镜像
在setttins.xml文件中找到标签对,进行修改: 1 2 3 nexus-aliyun 4 * 5 Nexus aliyun 6 http://maven.
94028 0
|
6月前
|
机器学习/深度学习 存储 算法
18个常用的强化学习算法整理:从基础方法到高级模型的理论技术与代码实现
本文系统讲解从基本强化学习方法到高级技术(如PPO、A3C、PlaNet等)的实现原理与编码过程,旨在通过理论结合代码的方式,构建对强化学习算法的全面理解。
891 10
18个常用的强化学习算法整理:从基础方法到高级模型的理论技术与代码实现
|
10月前
|
数据可视化 项目管理
个人和团队都好用的年度复盘工具:看板与KPT方法解析
本文带你了解高效方法KPT复盘法(Keep、Problem、Try),结合看板工具,帮助你理清头绪,快速完成年度复盘。
744 7
个人和团队都好用的年度复盘工具:看板与KPT方法解析
|
12月前
|
存储 监控 物联网
医疗物联网设备精细化管理系统解决方案
华汇数据智慧医院物联网管理系统解决方案是一种集物联网、云计算、大数据和人工智能等先进技术于一体的综合性解决方案,旨在提升医院的运营效率、医疗质量和患者满意度。
303 3
|
存储 移动开发 算法
Quorum NWR:通过仲裁实现数据一致性
Quorum NWR:通过仲裁实现数据一致性
215 11
|
运维 Cloud Native Java
Java项目部署的发展流程
本文对比分析了四种不同的应用部署方式:传统部署、虚拟化部署、容器化部署及云原生部署。传统部署直接在物理机上运行程序,存在资源复用难等问题。虚拟化部署通过虚拟机技术实现了资源的有效隔离与利用,但可能会造成性能损失。容器化部署则进一步提升了应用的可移植性和资源利用率,减轻了运维负担。云原生部署结合容器化、微服务等技术,实现了应用的快速迭代、高效运维和灵活扩展,适用于现代互联网应用的开发与部署。每种方式均针对其特点进行了详细的流程描述与优缺点分析。
176 2