首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    约瑟夫环问题详解

    在牛客网上做到一道题,是约瑟夫环的变型,所以借此学习一下新知识,并且巩固一下对题目意思的理解,这一篇仅作约瑟夫环问题的解释,下一篇再写题目: ##1.首先,我们先来了解一下什么是约瑟夫环问题: 讲一个比较有意思的故事...##2.这就是约瑟夫环问题,接下来我们说个特例初步了解下这种问题的求解思路: 特例:2,当q = 2时候,是一个特例,能快速求解 特例还分两种 ###1.思路:注意这里的前提是n = 2^k(也就是...见图下: 这时候,我们从3号开始,就成了另外一个规模小1的约瑟夫问题(恰好为2^k的特例)。...假设n = 11,这时候n = 2^3 + 3,也就是说t = 3,所以开始剔除元素直到其成为2^k问题的约瑟夫问题。...q个人 约定: Jq(n)表示n人构成的约瑟夫环,每次移除第q个人的解 n个人的编号从0开始至n-1 我们沿用之前特例的思想:能不能由Jq(n+1)的问题缩小成为J(n)的问题(这里的n是n+1规模的约瑟夫问题消除一个元素之后的答案

    42810

    经典算法之约瑟夫问题

    n-1个人的报数问题(即n-1阶约瑟夫环的问题) 可能以上过程你还是觉得不太清晰,那么我们重复以上过程,继续推导剩余的n-1个人的约瑟夫环的问题: 那么在这剩下的n-1个人中,我们也可以为了方便,将这n...n-2阶约瑟夫环的问题呢?...后面的过程与前两次的过程一模一样,那么递归处理下去,直到最后只剩下一个人的时候,便可以直接得出结果 当我们得到一个人的时候(即一阶约瑟夫环问题)的结果,那么我们是否能通过一阶约瑟夫环问题的结果,推导出二阶约瑟夫环的结果呢...借助上面的分析过程,我们知道,当在解决n阶约瑟夫环问题时,序号为k1的人出列后,剩下的n-1个人又重新组成了一个n-1阶的约瑟夫环,那么 假如得到了这个n-1阶约瑟夫环问题的结果为ans(即最后一个出列的人编号为...[n] = (f[n-1] + m)%n //m表示每次数到该数的人出列,n表示当前序列的总人数 而我们只需要得到第n次出列的结果即可,那么不需要另外声明数组保存数据,只需要直接一个for循环求得n阶约瑟夫环问题的结果即可

    1.7K10

    单向环形链表--约瑟夫问题

    首先来看一个著名的约瑟夫(Josephu)问题 设编号为1,2,3......个人围坐一圈,约定编号为k(1<=k <= n)的人从1开始报数,数到m的那个人出列,紧接着他的下一位又从1开始报数,数到m的那个人又出列,以此类推,直到所有人出列为止,由此产出一个编号的序列 如何解决上述问题.../遍历到最后 } temp = temp.getNext(); } } } 至此我们已经创建好了一个单向环形链表,接下来我们完成约瑟夫问题...约瑟夫问题 假设环形链表上有5个节点 设 k = 1 即从第一个节点开始计数 设 m = 2 即计数到m的那个节点出列,并记录其编号。...分析 这里涉及到一个问题,当我们出圈的时候,怎么把某个节点移除环形链表呢? 1.这里需要一个辅助指针helper,默认指向环形链表中的最后一个节点。

    32110

    环形链表的约瑟夫问题

    1.故事背景以及题目概述 通过这个例子,我们就应该大致了解这个环形链表的约瑟夫问题大致是干什么的,先说一个很简单的例子,比如有5个数据组成一个环形结构,每次数到2的数字自杀,最后这个环形链表只会保留一个数据...,具体如下图所示: 下面的就是牛客网的题目,这个题目表面上看比较委婉,把这个数字删除,其实其本质就是约瑟夫问题,下面我会拆解步骤为大家进行介绍解题思路。...就是我们想要解决这个约瑟夫问题,首先就需要创建一个环形的链表,这个链表肯定要有很多个节点,我们这步就是提前封装一个函数,我们在创建环形链表之后进行创建节点的时候可以直接调用这个函数; (1)我们想要创建节点就要开辟新的空间存放这个节点...如果count=0就会错过这个节点(可能表述不是很清晰,反正就是说pcur已经指向了一个节点,所以count应该初始化为1); (3)count==m就说明这个节点就是我们要删除的节点,这个节点就属于约瑟夫问题里面的报数节点...pcur指向新的节点,这个时候新的节点就是我们的报数节点的上一个节点的next指针指向的位置,让后让count=1重新开始计数; (4)这个过程就按照这样依次进行循环,什么时候循环会结束呢,我们都知道,约瑟夫问题里面最后会剩下一个节点

    7110

    UVALive 3882 - And Then There Was One【约瑟夫问题】

    com_onlinejudge&Itemid=8&page=show_problem&problem=1883 题意:n个人围成一圈,第一次删第m个人,然后每数K个删一个人,求最后一个人的编号 分析:典型的约瑟夫问题...则我们可以从这个人的后面编号设为k= m % n,则这n-1个人的编号依次为k,k+1,….n-1,n,1,2,…k-2; 则重新编号为0,1,2….n-2,那么我们就可以看作是在这n-1规模的子问题的约瑟夫环的基础上...,求解n规模的约瑟夫环。...设n-1规模的子问题的约瑟夫环的解为f[n-1],则n规模约瑟夫环是f[n] = (f[n-1] + k) % n; 证明过程如下: 原来编号依次为k,k+1,….n-1,n,1,2,…...] + m) % n;递推公式是f[i] = (f[i-1] + k) % i; 而f[1] = 0,则最后的结果是f[n]+1(因为f[n]是0,1…n-1编号的,所以要加1)这样,光秃秃的约瑟夫环问题就结束了

    58860
    领券