剑指 Offer 62. 圆圈中最后剩下的数字
5727. 找出游戏的获胜者
我们将上述问题建模为函数 f(n, k),该函数的返回值为最终留下的元素的序号。即:f(n, k) = y
我们假设f(n-1, k) = x
,然后来找一找f(n, k)和f(n-1, k)到底啥关系。
f(n, k) = y
从n到n-1, 只需要剔除掉一个数,这个数的下标是 (k-1) % n,此时序列由[0, 1, 2, ……, n-1]
变为[0, (k-1) % n)
和 ((k-1) % n, n-1]
两段((k-1) % n, n-1, 0, (k-1) % n))
,考虑到有可能剔除的是最后一个数,所以最终范围变成以((k-1)%n + 1)%(n-1)
为起始点的长为n-1的序列f(n-1, k) = x
的序列是从0开始长为n-1的序列,注意到没?相当于和上面的序列((k-1) % n, n-1, 0, (k-1) % n))
左移k个y = (x + k) % n
--> f(n, k) = (f(n-1, k) + k) % n
//递归
int f(int n, int k){
if(n == 1) return 0;
return (f(n-1, k) + k) % n;
}
//迭代
int f(int n, int k){
int ans = 0;
for(int i = 2; i <= n; ++i){
ans = (ans + k) % i;
}
return ans;
}
原文:https://www.cnblogs.com/miyanyan/p/14643829.html