62.圆圈中最后剩下的数字
62.圆圈中最后剩下的数字
题目描述
1.数学
递归
class Solution {
public int lastRemaining(int n, int m) {
if(n == 1){
return 0;
}
return (lastRemaining(n-1,m)+m)%n;
}
}
迭代
f(1,m) = 0; f(2,m) = (f(1,m)+m)%2;......;f(n,m)=(f(n-m)+m)%n
class Solution {
public int lastRemaining(int n, int m) {
if(n == 1){
return 0;
}
int last = 0;
for(int i = 2; i <= n;i++){
last = (last+m)%i;
}
return last;
}
}
数学解法(二)
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;
}
}
2.数组模拟圆环(超时)
class Solution {
public int lastRemaining(int n, int m) {
//数组模拟圆环
int[] arr = new int[n];
int cur = 0;//当前的下标
int num = n;//记录数组中剩余的数量
int temp = 0;//记录叫号叫到哪里了
while(num > 1){
if(cur == n){
cur = 0;
}
if(arr[cur] == 1){
cur++;
continue;
}
temp++;
if(temp == m){
arr[cur] = 1;
temp = 0;
num--;
}
cur++;
}
for(int i = 0; i < n;i++){
if(arr[i] == 1){
continue;
}
return i;
}
return -1;
}
}
3.ArrayList模拟圆环(超时)
class Solution {
public int lastRemaining(int n, int m) {
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0; i < n;i++){
list.add(i);
}
int idx = 0;
while(list.size()>1){
for(int i = 1; i < m; i++){
idx = (idx+1) % list.size();
}
list.remove(idx);
}
return list.get(0);
}
}