模拟一个环形链表,当报数到m-1的时候,就将对应下标的移除链表,然后继续从0开始报数到m-1,继续移除,知道剩下一个为止
public int LastRemaining_Solution(int n, int m) {
if(n < 1 || m < 1)
return -1;
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0; i < n; i++) list.add(i);
int pre = 0; /*从0开始*/
while(list.size() > 1){
pre = (pre+m-1)%list.size(); /*在前一个移除数的基础上,报m-1次,就是移除数的下标,用取模模拟环*/
list.remove(pre);
}
return list.get(0);
} 使用数学规律
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;
}
}

京公网安备 11010502036488号