剑指 Offer 62. 圆圈中最后剩下的数字

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

剑指 Offer 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


解题过程

解题思路

递归或者迭代,关键是找出递推公式:
假设 f ( n − 1 , m ) = x f(n-1,m) = x f(n−1,m)=x为删除了(n-1)个元素后的位置,那么删除了n个元素后的位置应该是 f ( n , m ) = ( x + m ) % n f(n,m)=(x + m)\%n f(n,m)=(x+m)%n
其中,取余是为了能够循环形成圆圈。
在递归中,我们求f(n,m),f(n-1,m)…f(1,m)。其实f(1,m)一定是返回0的。

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

    }
}

总结

暂时没有总结,待续。。。

上一篇:【大话数据结构C语言】62 散列表(哈希表)查找


下一篇:2021-5-30 剑指 Offer 62. 圆圈中最后剩下的数字(约瑟夫环问题)