LeetCode390. 消除游戏题解(Medium)

LeetCode390. 消除游戏题解(Medium)


等差数列相关知识


扩展:等比数列相关知识

题目内容

390. 消除游戏
列表 arr 由在范围 [1, n] 中的所有整数组成,并按严格递增排序。请你对 arr 应用下述算法:
从左到右,删除第一个数字,然后每隔一个数字删除一个,直到到达列表末尾。
重复上面的步骤,但这次是从右到左。也就是,删除最右侧的数字,然后剩下的数字每隔一个删除一个。
不断重复这两步,从左到右和从右到左交替进行,直到只剩下一个数字。
给你整数 n ,返回 arr 最后剩下的数字。

题解

等差数列模拟

依照题意,我们每次都将整数列表进行间隔删除,因此每次删除后剩余的整数列表都是等差数列。
初始时尚未删除任何元素。
如果是偶数,则从左向右删除。
如果元素数目为奇数,则两端的元素都会被删除。
如果元素数目​为偶数,则首端元素会被删除,末端元素不会被删除。
如果是奇数,则从右向左删除。
如果元素数目为奇数,则两端的元素都会被删除。
如果元素数目为偶数,则首端元素不会被删除,末端元素会被删除。
当等差数列只剩一个元素时,返回首元素即可。

class Solution {
public:
    int lastRemaining(int n) {
        int a1 = 1, an = n;
        int k = 0, cnt = n, step = 1;
        while (cnt > 1) {
            if (k % 2 == 0) { // 正向
                a1 = a1 + step;
                an = (cnt % 2 == 0) ? an : an - step;
            } else { // 反向
                a1 = (cnt % 2 == 0) ? a1 : a1 + step;
                an = an - step;
            }
            k++;
            cnt = cnt >> 1;
            step = step << 1;
        }
        return a1;
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/elimination-game/solution/xiao-chu-you-xi-by-leetcode-solution-ydpb/
来源:力扣(LeetCode)

复杂度

时间复杂度:O(logn),其中 n 为初始整数列表的元素数目。每次删除都会将元素数目减半,所以时间复杂度为O(logn)。
空间复杂度:O(1)。只需要使用常数的额外空间。

注:其实不用实际真的移除,记录一下每次剩下的最大最小值以及本轮移除的间隔就好了

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>