剑指offer--孩子们的游戏(圆圈中最后剩下的数字)
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。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--孩子们的游戏(圆圈中最后剩下的数字)的更多相关文章
- 剑指Offer——孩子们的游戏(圆圈中最后剩下的数)
题目描述: 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机 ...
- 剑指offer--42.孩子们的游戏(圆圈中最后剩下的数)
约瑟夫环,用链表,队列,总之模拟过程 ----------------------------------------------------------------- 时间限制:1秒 空间限制:32 ...
- 剑指Offer-46.孩子们的游戏(圆圈中最后剩下的数)(C++/Java)
题目: 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指定 ...
- 剑指 offer set 21 圆圈中最后剩下的数字
思路 1. 经典解法是用环形链表模拟圆圈, 然后每次减少一个节点. 时间复杂度为 o(mn), 空间复杂度为 o(n) 2. 转化成数学问题, 递推公式决定下一个元素. 时间复杂度为 o(n), 空间 ...
- 剑指Offer - 九度1356 - 孩子们的游戏(圆圈中最后剩下的数)
剑指Offer - 九度1356 - 孩子们的游戏(圆圈中最后剩下的数)2014-02-05 19:37 题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.H ...
- 【剑指Offer】孩子们的游戏(圆圈中最后剩下的数) 解题报告(Python)
[剑指Offer]孩子们的游戏(圆圈中最后剩下的数) 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-in ...
- 【剑指Offer面试编程题】题目1356:孩子们的游戏(圆圈中最后剩下的数)--九度OJ
题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为JOBDU的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈. ...
- 【剑指offer】50.数组中重复出现的数字
50.数组中重复出现的数字 知识点:数组:Set的不可重复性 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重 ...
- 剑指Offer 46. 孩子们的游戏(圆圈中最后剩下的数) (其他)
题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指 ...
- 剑指offer四十六之孩子们的游戏(圆圈中最后剩下的数,约瑟夫环问题)
一.题目 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指 ...
随机推荐
- NGK数字增益平台的算力是什么?
今年的币价回暖带来了新一轮的"信仰充值",部分投资者对比特币的兴趣从购买向更源头的算力转移.随着比特币开采数量逐渐减少,全网算力一直在增加,算力难度也是越来越高.同时在算力行业中竞 ...
- Masterboxan INC发布《2019年可持续发展报告》
近日,Masterboxan INC万事达资产管理有限公司(公司编号:20151264097)发布<2019年可持续发展报告>,全面回顾了在过去一年Masterboxan INC开展的可持 ...
- 如何在一台开发机中同时配置github、gitlab等多个账户
本文参考博文. 如果公司的代码同步环境在gitlab上,而自己有很多项目托管在github.我们需要做一些额外的配置实现两者的无缝切换. 步骤 我的开发机是macbook,如果属于不同系统,找到该系统 ...
- easyPOI基本用法
参考网址:http://www.wupaas.com/ 1.Excel文件的导入导出 项目源码:后台:https://github.com/zhongyushi-git/easypoi-demo-ad ...
- SpringBoot2.x中的AOP机制总结(附带demo)
寄语:刚开始学aop的时候是大三吧,老师讲的不好,我也没学好,导致现在才有个较为清晰的认知,那个时候只知道有aop, 根部不明白aop的作用,时至今日,任然觉得aop难以咀嚼,奈何平时不用面试要用,特 ...
- Spring Boot和Thymeleaf整合,结合JPA实现分页效果
在项目里,我需要做一个Spring Boot结合Thymeleaf前端模版,结合JPA实现分页的演示效果.做的时候发现有些问题,也查了现有网上的不少文档,发现能全栈实现的不多,所以这里我就把我的做法, ...
- 纯生js实现Element中input组件的部分功能(慢慢完善)并封装成组件
现在实现的有基础用法.可清空.密码框,参考链接:https://element.eleme.cn/#/zh-CN/component/input HTML代码:想要测试哪个组件,直接将对应组件解开注释 ...
- Deep Unfolding Network for Image Super-Resolution 论文解读
Introduction 超分是一个在 low level CV 领域中经典的病态问题,比如增强图像视觉质量.改善其他 high level 视觉任务的表现.Zhang Kai 老师这篇文章在我看到的 ...
- MySQL注入流程
目录 确认注入点 信息收集 数据获取 提权 写个MySQL注入流程的大纲,类似一份全局地图,能指导下一步工作.MySQL注入流程分为四步: 确认注入点 信息收集 数据获取 提权 确认注入点 参考:ht ...
- web服务器-并发服务器2
阅读目录 1.Web静态服务器-5-非堵塞模式 2.Web静态服务器-6-epoll 3.Web静态服务器-7-gevent版 4.知识扩展-C10K问题 一.Web静态服务器-5-非堵塞模式 单进程 ...