栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【LeetCode】数学

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【LeetCode】数学

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

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

纯模拟会超时

class Solution {
    public int lastRemaining(int n) {
        List list=new ArrayList<>();
        for(int i=0;ilist.add(i+1);}
        int d=0;
        while(true){
            d++;
            if(d%2==1){
                for(int i=0;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;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/876110.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号