剑指offer【62】:约瑟夫环问题,例子+递推

题目:

剑指offer【62】:约瑟夫环问题,例子+递推_第1张图片

思路+代码:

举例:

剑指offer【62】:约瑟夫环问题,例子+递推_第2张图片

序号递推关系:

剑指offer【62】:约瑟夫环问题,例子+递推_第3张图片
思路:

约瑟夫环,首先理解,最终留下的数字在每轮删掉一个数剩下数组中都存在,只是索引不同;
然后知道只剩一个数时索引一定为0,比如 F(8,3) 可以由 F(7,3)推出;
f(n,m) = (f(n-1, m) + m) % n

class Solution:
    # 思路:
    #   约瑟夫环,首先理解,最终留下的数字在每轮删掉一个数剩下数组中都存在,只是索引不同;
    #   然后知道只剩一个数时索引一定为0,比如 F(8,3) 可以由 F(7,3)推出;比如通过 F(7,3)知道了最后剩那个数索引是 x, 则
    #       F(8,3) = (x + m) % 8;
    #   f(n,m) = (f(n-1, m) + m) % n ;

    def lastRemaining(self, n: int, m: int) -> int:
        return self.f(n, m)

    def f(self, n, m):
        if n == 0:
            return 0
        x = self.f(n - 1, m)
        return (m + x) % n

你可能感兴趣的:(剑指offer,dp,约瑟夫环)