第 42 日:圆圈中最后剩下的数字
题目链接:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/
题目
解题
-
模拟链表
解题思路:
创建ArrayList并把元素全部添加,删除对应字符.。
这种方法效率比较低,每次删除后还要将后面的数前移。
时间复杂度:O(n2)详细代码如下:
class Solution {
public int lastRemaining(int n, int m) {
ArrayList<Integer> array = new ArrayList<>();
for (int i = 0; i < n; i++) {
array.add(i);
}
int i = 0;
while (n != 1){
i = (i + m - 1) % n;
array.remove(i);
n--;
}
return array.get(0);
}
}
-
数学
解题思路:
最终剩下一个人时的安全位置肯定为0,反推安全位置在人数为n时的编号
人数为1: 0 =f(1)
人数为2: (f(1) + m) % 2 =f(2)
人数为3: (f(2) + m) % 3 =f(3)
人数为4: (f(3) + m) % 4 =f(4)
........
迭代推理到n就可以得出答案
时间复杂度O(1)
详细的推理可以看K神
详细代码如下:
class Solution {
public int lastRemaining(int n, int m) {
int x=0;
for (int i = 2; i <= n; i++) {
x=(x+m)%i;
}
return x;
}
}