class Solution {
public int lastRemaining(int n, int m) {
// 模拟法
List<Integer> list = new ArrayList<>(n);
for (int i = 0; i < n; i++) {
list.add(i);
}
int idx = 0;
while (n > 1) {
idx = (idx + m - 1) % n; // 下一个删除的位置. 减1是因为当前删完之后,游标会左移一位
list.remove(idx);
n--;
}
return list.get(0);
}
}
约瑟夫环: (当前index + m) % 上一轮剩余数字的个数
class Solution {
public int lastRemaining(int n, int m) {
int ans = 0;
// 最后一轮剩下2个人,所以从2开始反推
for (int i = 2; i <= n; i++) {
ans = (ans + m) % i;
}
return ans;
}
}