题干
0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
示例 1:
输入: n = 5, m = 3
输出: 3
示例 2:
输入: n = 10, m = 17
输出: 2
限制:
1 <= n <= 10^5
1 <= m <= 10^6
想法
这道题题意最开又没读懂,
其实它的意思是第一次从0开始删除,然后后面从删除的那个数的后面一个位置开始数m个并删除。
可以看出规律是确定的,即每次都向后动m个并删除,如果使用队列来模拟肯定不行,读取next就会话费不少时间。
于是我们倒过来想:
对于最后那个数的最后情况:
即整个圈只剩下它,设它上一轮坐标为x,它此时的坐标一定为0,
原本上一轮还剩两个数,
x=(0+m)%2,
意思是现在的额坐标加上m的长度%环的长度等于这一轮的坐标
这样倒退回去即可
相当于一层一层恢复,能够知道最后那个元素在原本的位置,就可以知道那个元素的值
如果还没考懂推荐看我参考的这个
Java代码
public class LastRemaining {
public int lastRemaining(int n, int m) {
//最后坐标为0
int res=0;
for(int i=2;i<=n;i++){
//上一轮等于加上m%这一轮的环长度,又因为倒数第二轮长度为2,所以i从2开始
res=(res+m)%i;
}
return res;
}
public static void main(String[] args){
LastRemaining lastRemaining=new LastRemaining();
System.out.println(lastRemaining.lastRemaining(5,3));}
}