leetcode【每日一题】面试题62. 圆圈中最后剩下的数字Java

题干

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));}
}

我的git代码都已经上传到我的git

发布了180 篇原创文章 · 获赞 0 · 访问量 3777

猜你喜欢

转载自blog.csdn.net/qq_43491066/article/details/105193715
今日推荐