Elimination Game

题目来源
淘汰游戏,先从前往后淘汰,再从后往前淘汰,每次都是每隔一个淘汰一个,问最后剩下什么数字。
我是记录了开始和结尾,不断改变更新,直到开始和结尾是一样的。
复杂度是O(logn)。

class Solution {
public:
    int lastRemaining(int n) {
        int curStart = 1, curEnd = n, interval = 1;
        while (curStart != curEnd) {
            int tmp = curStart;
            if (((abs(curEnd - curStart)) / interval + 1) % 2 == 0) {
                curStart = curEnd;
                curEnd = tmp + interval;
            }
            else {
                curStart = curEnd - interval;
                curEnd = tmp + interval;
            }
            interval *= -2;
        }
        return curStart;
    }
};

看了下讨论区,解法更加简洁明了。只记录最小的数字、间隔、剩余数字个数以及是否从左边开始。靠这些就可以对这些记录进行更新。直到剩余数字个数为1。

class Solution {
public:
    int lastRemaining(int n) {
        int curHead = 1, interval = 1, remaining = n;
        bool isLeft = true;
        while (remaining > 1) {
            if (isLeft || remaining % 2 == 1)
                curHead += interval;
            remaining /= 2;
            interval *= 2;
            isLeft = !isLeft;
        }
        return curHead;
    }
};
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • There is a list of sorted integers from 1 to n. Starting ...
    Jeanz阅读 568评论 0赞 0
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 13,090评论 0赞 33
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,134评论 6赞 13
  • 把心放在对方身上,先感受到他的快乐、愤怒、痛苦、激动,然后聆听。先去理解别人,然后再寻求被别人理解。 聆听是一种技...
    ZouNana阅读 322评论 0赞 2
  • 2017.9.14.星期四,晴。 加油。
    思兹念兹阅读 256评论 2赞 2

友情链接更多精彩内容