LeetCode 62. 圆圈中最后剩下的数字

面试题62. 圆圈中最后剩下的数字

难度简单

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

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

示例 1:

输入: n = 5, m = 3
输出: 3

示例 2:

输入: n = 10, m = 17
输出: 2

限制:

  • 1 <= n <= 10^5
  • 1 <= m <= 10^6

思路:看到约瑟夫环首先想到的是用单链表做成的环,然后不断地转圈取元素,但是这道题有限制,一般链表会超时,所以学习了另一种数学方法。

以n=5,m=3为例:

0,1,2,3,4,

第一次取出元素后,它变成了0,1,#,3,4,

可以将右面的的元素提前,变为3,4,0,1

再次取出元素,变为3,4,#,1

提前元素,变为1,3,4

再次取出元素,变为1,3,#

提前元素,变为1,3

最后一次,只剩下一个人3

我们可以这样理解,就是倒着推

1个人:0的位置

2个人:从0的位置向后移动m位,到了1的位置(0->1->0->1)

3个人:从1的位置向后移动m位,到了1的位置(1->2->0->1)

4个人:从1的位置向后移动m位,到了0的位置(1->2->3->0)

5个人:从0的位置向后移动m位,到了3的位置(0->1->2->3)

所以应该是n的答案是从n-1向右移动m个位置

数组到达最后就依靠%返回到头部

int lastRemaining(int n, int m){
    if(n==1){
        return 0;
    }
    return (lastRemaining((n-1),m)+m)%n;
}

原文地址:https://www.cnblogs.com/woju/p/12600001.html

时间: 2024-10-14 01:08:15

LeetCode 62. 圆圈中最后剩下的数字的相关文章

LeetCode 面试题62. 圆圈中最后剩下的数字

我的LeetCode:https://leetcode-cn.com/u/ituring/ 我的LeetCode刷题源码[GitHub]:https://github.com/izhoujie/Algorithmcii LeetCode 面试题62. 圆圈中最后剩下的数字 题目 0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字

剑指Offer对答如流系列 - 圆圈中最后剩下的数字

面试题62:圆圈中最后剩下的数字 题目描述 0, 1, -, n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,从数字0开始每次删除第3个数字,则删除的前四个数字是2 0 4 1 因此最后剩下的数字是3 问题分析 思路一: 既然涉及到数据的频繁删除,可以考虑使用链表来存放数据,每次对长度取余数可以实现循环操作. 思路二: 这种问题规律性非常强,其实已经有对这一规律背后的数学模型的探究,即约瑟夫环 举一个具体的场景: 据说著名犹太历

编程算法 - 圆圈中最后剩下的数字(递推公式) 代码(C++)

圆圈中最后剩下的数字(递推公式) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 0,1...,n-1这n个数字排成一个圆圈, 从数字0開始每次从这个圆圈里删除第m个数字. 求出这个圆圈里最后剩下的数字. 能够推导出约瑟夫环的递推公式, 使用循环进行求解,  时间复杂度O(n), 空间复杂度O(1). 代码: /* * main.cpp * * Created on: 2014.7.12 * Author: spike */ #incl

编程算法 - 圆圈中最后剩下的数字(循环链表) 代码(C++)

圆圈中最后剩下的数字(循环链表) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 0,1...,n-1这n个数字排成一个圆圈, 从数字0开始每次从这个圆圈里删除第m个数字. 求出这个圆圈里最后剩下的数字. 使用循环链表, 依次遍历删除, 时间复杂度O(mn), 空间复杂度O(n). 代码: /* * main.cpp * * Created on: 2014.7.13 * Author: Spike */ #include <iostr

LeetCode1579题——圆圈中最后剩下的数字

1.题目描述:0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字.例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2.0.4.1,因此最后剩下的数字是3. 2.示例:示例 1:输入: n = 5, m = 3输出: 3 示例 2:输入: n = 10, m = 17输出: 2 限制:1 <= n <= 10^51 <= m <= 10^6 3.解题思路(1)将

面试题62:圆圈中最后剩下的数字(C++)

题目地址:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/ 题目描述 0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2.0.4.1,因此最后剩下的数字是3. 题目示例 示例 1: 输入: n = 5, m

求解圆圈中最后剩下的数字

一,问题描述 将 0,1,2....n-1 一共n个数字排成一个圆圈.从数字0开始每次从这个圆圈里面删除第m个数字( 1=<m<=n, 比如第1个数字为0).求出这个圆圈里面最后剩下的那个数字. 二,问题分析 使用java.util.LinkedList类保存这N个数字,并调用 remove(int index)方法来执行删除链表中指定位置的元素. 问题的关键是:如何找到链表中 每次待删除的元素的位置.一共有下面三种方法: 第一种方式是对链表进行遍历,第二种方式是模拟链表的遍历(但是不对链表进

剑指offer圆圈中最后剩下的数字 和 迭代器总结

迭代器只有++ ,--,==,!=四种运算方法,不能将iter = iteration+ 1,因为迭代器是指针类型,1是整数类型,不能直接相加赋值给一个指针. 题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指定一个数m,让编号为0的小朋友开始报数.每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下

45 - 圆圈中最后剩下的数字

题目要求: 0, 1, - , n-1 这 n 个数字排成一个圈,从数字 0 开始每次从这个圈里删除第 m 个数字.求这个圈剩下的最后一个数字. 本题是约瑟夫环问题. 除了以下给出的2中解法,更高级的算法:约瑟夫问题的两个O(log n)解法 1. 环形链表 由于要不断地从圈里删除一个数字,容易想到用链表实现.用链表将这 n 个数字存储,头尾相连,每隔 m 个删除一个,最后剩下的即为结果. 由于数字从 0 开始,待删除的数字: k = (m-1) % n; 每删除 1 个都要遍历 m 个节点,需