力扣刷题——3096.得到更多分数的最少关卡数目

根据题意,假如alice选择完成第i关到第j关,那么bob需要完成第j+1关到第n关,其中i<=j<n。如此可以想到对关卡数组进行预处理,构建一个前缀和数组,保存假如从第0关每关都通过的话,到第i关所得到的分数。
通过遍历一次前缀和数组,能够得到每个时刻alice得到的分数和bob得到的分数,当alice获得的分数超过了bob那么就可以直接输出结果,假如遍历完成后仍然没有alice得分高于bob得分的情况,那么就输出-1。

class Solution
{
public:
    int minimumLevels(vector<int> &possible)
    {
        vector<int> preSum;
        int totalSum = possible[0] == 1 ? 1 : -1;
        preSum.emplace_back(0);
        int alicePlay = 1;
        for (int i = 1; i < possible.size(); i++)
        {
            preSum.emplace_back(totalSum);
            totalSum += possible[i] == 1 ? 1 : -1;
        }
        while (alicePlay < preSum.size())
        {
            if (preSum[alicePlay] > totalSum - preSum[alicePlay])
                return alicePlay;
            alicePlay++;
        }

        return -1;
    }
};