每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)

解法一:数组(python实现)

维持一个数组,和一个索引cur指向要删除的位置,当cur的指等于数组的大小时,令cur回到头位置

class Solution:
def LastRemaining_Solution(self, n, m):
if n<1 or m < 1: return -1
children = list(range(n))
cur = -1
while len(children) > 1:
for i in range(m):
cur += 1
if(cur == len(children)):
cur = 0
del children[cur]
       //在新的list中cur指向了下一个元素,为了保证移动m个的准确性,cur需要向前移动一位
cur -= 1
return children[0]

解法二:循环链表(c++实现)

构建一个循环链表依次删除喊m-1的节点,当链表中只剩一个节点时,输出这个节点的值

class Solution {
public:
int LastRemaining_Solution(int n, int m)
{
if(n<1||m<1) return -1;
ListNode *pHead = createCircularListNode(n);
ListNode *pNode = pHead;
  
while(pNode!=pNode->next){
       //将喊m-1的孩子移出圆圈
for(int j = 1; j<m-1; j++){
pNode = pNode->next;
}
ListNode *ptemp = pNode->next;
pNode->next = ptemp->next;
free(ptemp);
pNode = pNode->next;
}
return pNode->val;
}
   // 创建循环链表
ListNode *createCircularListNode(int n){
ListNode *phead, *pNode;
phead = NULL;
     //创建链表
if(n!=0){
for(int i = 0; i < n; i++){
ListNode* ptemp = (ListNode*)malloc(sizeof(ListNode));
ptemp->val = i;
if(phead == NULL){
phead = ptemp;
pNode = phead;
}
else{
pNode->next = ptemp;
pNode = ptemp;
}
}
       //将尾指针指向头指针
pNode->next = phead;
}
return phead;
}
};

时间复杂度O(n) ,空间复杂度O(n)

解法三:数学公式(JAVA实现)

对于n个孩子参与的游戏,第一轮游戏删除带有下划线的那个(喊m-1的孩子)  0,  1,  2,  .... m-1,  m,  m+1,  m+2, ....   n-2,   n-1

得到新的数组  0,  1,  2,  .... m-2,  m,  m+1,  m+2, ....   n-2,   n-1

从m处重新开始从0报数,上述数组重新排列 m,  m+1,  m+2, ....   n-2,   n-1,0,  1,  2,  ...., m-3,  m-2. 

按照上边的顺序从0开始编号,对应的编号为 0,  1,  2,... n-(m+2),  n-(m+1),  n-m,  m-(m-1), n-(m-2), ..., n-3,  n-2

若上一行为x' 下一行为x,则对应关系为:x= (x+m) % n

通过上表可得,将1人出队后的数据重新组织成0-(n-2) 共计n-1个人的列表,并求由n-1个人参与,并将其中报m-1的人出列的问题.也就是说要求原问题n个人参与的解,可以先求n-1个人参与的解,然后通过转换公式得出n个人参与的解.

因此当n=1时是规模最小的情况,F(1) = 0, 当n=2时根据公式可知问题的解F(2) = (F(1)+m)%2, 当有n个人时问题的解 F(n) = (F(n-1)+m)%n, 可以用递归也可以用递推的方式解决这个问题,如果用递归解决的话存在大量重复计算的问题,因此我们可以用递推的方式求解

public class Solution {
public int LastRemaining_Solution(int n, int m) {
if(n<1||m<1) return -1;
int cur=0;
for(int i = 1; i < n; i++){
cur = (cur+m)%(i+1);
}
return cur;
}
}

时间复杂度O(n) ,空间复杂度O(1)

剑指offer--孩子们的游戏(圆圈中最后剩下的数字)的更多相关文章

  1. 剑指Offer——孩子们的游戏(圆圈中最后剩下的数)

    题目描述: 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机 ...

  2. 剑指offer--42.孩子们的游戏(圆圈中最后剩下的数)

    约瑟夫环,用链表,队列,总之模拟过程 ----------------------------------------------------------------- 时间限制:1秒 空间限制:32 ...

  3. 剑指Offer-46.孩子们的游戏(圆圈中最后剩下的数)(C++/Java)

    题目: 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指定 ...

  4. 剑指 offer set 21 圆圈中最后剩下的数字

    思路 1. 经典解法是用环形链表模拟圆圈, 然后每次减少一个节点. 时间复杂度为 o(mn), 空间复杂度为 o(n) 2. 转化成数学问题, 递推公式决定下一个元素. 时间复杂度为 o(n), 空间 ...

  5. 剑指Offer - 九度1356 - 孩子们的游戏(圆圈中最后剩下的数)

    剑指Offer - 九度1356 - 孩子们的游戏(圆圈中最后剩下的数)2014-02-05 19:37 题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.H ...

  6. 【剑指Offer】孩子们的游戏(圆圈中最后剩下的数) 解题报告(Python)

    [剑指Offer]孩子们的游戏(圆圈中最后剩下的数) 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-in ...

  7. 【剑指Offer面试编程题】题目1356:孩子们的游戏(圆圈中最后剩下的数)--九度OJ

    题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为JOBDU的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈. ...

  8. 【剑指offer】50.数组中重复出现的数字

    50.数组中重复出现的数字 知识点:数组:Set的不可重复性 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重 ...

  9. 剑指Offer 46. 孩子们的游戏(圆圈中最后剩下的数) (其他)

    题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指 ...

  10. 剑指offer四十六之孩子们的游戏(圆圈中最后剩下的数,约瑟夫环问题)

    一.题目 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指 ...

随机推荐

  1. 稳定币USDN的算法调控

    在NGK公链的稳定币系统中,USDN的价格有时会出现一定幅度的波动.正如我们会看到USDT有时会是0.99美元,有时是1.01美元一样.那么,要保障USDN在二级市场的价格基本稳定,要如何调节供需呢? ...

  2. WLAN-AC+AP射频一劳永逸的调优方式

    AP射频调优组网图 射频调优简介 射频调优的主要功能就是动态调整AP的信道和功率,可以使同一AC管理的各AP的信道和功率保持相对平衡,保证AP工作在最佳状态.WLAN网络中,AP的工作状态会受到周围环 ...

  3. 安装mysql报错

    原文链接:https://blog.csdn.net/bao19901210/article/details/51917641 二进制安装 1.添加mysql组和mysql用户,用于设置mysql安装 ...

  4. Oracle数据库在给表添加字段的sql中用comment报错

    原因:不同于mysql,Oracle数据库在添加表字段时不能直接用comment,而是单独写一个sql语句,如下: alter table SYS_USER add SENDMSG_LASTTIME ...

  5. Spring Boot集成Springfox Swagger3和简单应用

    摘要:Springfox Swagger可以动态生成 API 接口供前后端进行交互和在线调试接口,Spring Boot 框架是目前非常流行的微服务框架,所以,在Spring Boot 项目中集成Sp ...

  6. 用 hexo 快速搭建博客

    如何做到一毛不拔的搭建网站 以下操作全程使用管理员权限,因为我不清楚哪里会出现 permission denied 1.下载 nodejs 对应 windows 用户,下载对应的 ".msi ...

  7. 谈一谈C#的事件

    谈一谈C#的事件 C#中事件基于委托,要理解事件要先理解委托,如果觉得自己关于委托不是很了解可以看看我前面写委托的文章 事件基于委托,是一种功能受限的委托,为委托提供了一种发布/订阅机制 使用委托时, ...

  8. windows下MySQL如何完全卸载并安装行的版本

    卸载本地mysql之前,请务必要先将需要的数据库备份 停止mysql 服务 windows键-->搜索服务 找到mysql 服务,并停止他 卸载mysql server 在控制面板--程序 找到 ...

  9. kubernetes生产实践之redis-cluster

    方案一 自定义yaml文件安装redis cluster 背景 在Kubernetes中部署Redis集群面临挑战,因为每个Redis实例都依赖于一个配置文件,该文件可以跟踪其他集群实例及其角色.为此 ...

  10. Python基础【基本数据类型】

    基本数据类型分类 数字            int 字符串         str 列表            list 字典            dict 元祖            tuple ...