约瑟夫环
问题:
n个人成环
从 1 开始报数
报到M的人杀掉
求剩下最后一个人的编号
解决:
若采用链表或者数组模拟,基础解法的时间复杂度为O(mn)
采用公式解法时间复杂度可以降到O(n)
code:
int circle(int n, int m){
int ans;
for(int i=2; i <= n; i++){
ans = (ans + m)%i;
}
return ans+1;
}
分析:
f(N,M) = N个·报数,每报到M时杀掉此人·,最终胜利者的编号
递推式:f(N,M) = ( f(N-1,M) + M ) % n;
举例分析:观察ans的变化可以发现规律;