题目:
0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
来源:力扣(LeetCode)
思路:
么当我们删除一个数字,就将整个数组中的所有数字向前挪动m位,这样我们每次删除一个数字时都是从数组中第一个元素算起,而当我们删除到最后的时候,整个数组便只剩下一个元素。
而我们的思路便将上诉过程的逆过来思考。
我们知道,如果当数组只剩下x个元素且我们最终存活的元素下标是p,那么在元素个数为x+1时,p = (p+m)%(x+1)。
由于我们知道数组元素为1,且最终存活下标为0。我们便可以逆推到元素个数为n时,最终存活元素的下标。
整个过程有点类似递归,我们先拿到的是最终结果。
class Solution {
public int lastRemaining(int n, int m) {
if(n == 1)
return 0;
int res = 0;
for(int i = 2;i<=n;i++){
res = (res+m)%i;
}
return res;
}
}