public int lastRemaining(int n, int m) {
// 把这个0 ~ n-1存起来
List<Integer> list = new ArrayList<>();
for (int i = 0; i < n; i++){
list.add(i);
}
int delete = 0;
// 循环直到list中只剩一个
while (list.size() > 1){
// 得到删除的下标并删除
delete = (delete + m - 1) % list.size();
list.remove(delete);
}
return list.get(0);
}

这时间复杂度不可接受 那当然要找到数学规律
public int lastRemaining(int n, int m) {
int x = 0;
// 最后一轮剩下2个,所以从2开始反推
for (int i = 2; i <= n; i++) {
x = (x + m) % i;
}
return x;
}

本文探讨了一种改进的时间复杂度算法,通过数学推导,避免了列表操作,直接计算当n和m给定时,lastRemaining函数的最终结果。核心内容是反向求解剩余元素的公式,从而提高效率。

被折叠的 条评论
为什么被折叠?



