分析:
1、用队列模拟,时间复杂度O(mn)
2、注意count++的位置,以及最后count == m - 1 时count的赋值,如果赋值为0的话,最后count++,变成一,自动跳过count==0的情况发生错误。
3、分析题目,得到递归公式:
f(n,m) = 0 n=1
[f(n-1,m) + m] %n n>1
维护一个数组就能得到结果。
代码1:
mport java.util.LinkedList;
import java.util.Queue;
public class Solution {
public int LastRemaining_Solution(int n, int m) {
int res = -1;
if(n <= 0 || m <= 0) return res;
Queue<Integer> que = new LinkedList<Integer>();
for(int i = 0 ; i < n ; i ++){
que.add(i);
}
int cur = -1,count = 0;
while(que.size() != 0){
if(que.size() == 1) {
res = que.peek();
que.poll();
break;
}
if(count == m-1){
count = -1 ;
que.poll();
// continue;
}
else{
cur = que.peek();
que.poll();
que.add(cur);
}
count++;
}
return res;
}
}
代码2:
public class Solution {
public int LastRemaining_Solution(int n, int m) {
if(n < 1 || m < 1)
return -1;
int last = 0;
for(int i = 2; i <= n; i++){
last = (last + m) % i;
}
return last;
}
}