采用逆向思考的方法,倒退出最后这个元素在最开始所在的位置
假设:size代表当前有几个元素,pos代表最后剩下的元素在当前环里面所在的下标,k代表每k个元素删除一个,n代表最开始有几个元素
- 当最后只剩一个元素的时候,它的下标是0,即size=1,pos=0,我们称这个元素为r;
- 当剩两个元素的时候,r的下标应该为:(0+k)% 2,size为2;
0是上一轮r的位置下标
- 所以依次递推,当剩n-1个元素的时候,r的下标为pos,那么最开始有n个元素的时候,r的下标应该为:(pos+k)%size
class Solution {
public int findTheWinner(int n, int k) {
return levelOrder(1,0,k,n)+1;
}
public int levelOrder(int size,int pos,int k, int n) {
size++;
pos=(pos+k)%size;
if (size==n) return pos;
else return levelOrder(size,k,pos,n);
}
}