【LeetCode】数学

【LeetCode】数学,第1张

等差数列 390. 消除游戏 - medium

【参考:390. 消除游戏 - 力扣(LeetCode)】

纯模拟会超时

class Solution {
    public int lastRemaining(int n) {
        List<Integer> list=new ArrayList<>();
        for(int i=0;i<n;i++){list.add(i+1);}
        int d=0;
        while(true){
            d++;
            if(d%2==1){
                for(int i=0;i<list.size();i++){
                    if(list.size()==1){return list.get(0);}
                    list.remove(i);
                }
            }
            else{
                for(int i=list.size()-1;i>=0;i-=2){
                    if(list.size()==1){return list.get(0);}
                    list.remove(i);
                }
            }
        }
    }
}

【参考:C++ 数学+找规律 - 消除游戏 - 力扣(LeetCode)】

class Solution {
    public int lastRemaining(int n) {
        int num=n; // 当前数组元素个数
        boolean left_to_right=true; // 判断此时是从左到右还是从右到左删除
        int a0=1; // 首项
        int d=1; // 公差
        while(num!=1){
            if(num%2==1){//num为奇数
                // a0=a0+d 是a0=a1=a0+d
                a0=a0+d;// 无论从左到右还是从右到左第一位都会被删,首项都会改变
            }
            else if(num%2==0){
               if(left_to_right)
                    a0=a0+d;//从左到右删首项会改变
               else
                    a0=a0;//从右到左删首项不变
            }
            left_to_right=!left_to_right;//每一轮改变删除方向
            d*=2; // 公差变大
            num/=2; // 个数向下取1/2
        }
        return a0;
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/915169.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存