【Leetcode】3096-1501

前言

前缀和的简单应用,但是空间复杂度能否仅用常数呢?时间复杂度的O(N)的系数能否减小一些呢?


思路

Alice通过前边x个关卡,Bob通过剩余的,那么Alice得到的分数实际上就是前边x个关卡对应的前缀和,而Bob则是整个关卡对应的前缀和减去Alice得到的分数的前缀和。
因此只需要得到每个位置对应的前缀和,然后遍历Alice可能得到的分数和Bob可能得到的分数即可

class Solution:
    def minimumLevels(self, possible: List[int]) -> int:
        ans = -1
        sub = []
        cur = 0
        for x in possible:
            cur += 2*x-1
            sub.append(cur)
        for i in range(len(sub)-1):
            if sub[-1] - sub[i] < sub[i]:
                return i + 1
        return -1

另外可以看到的是,由于总是拿到总共的前缀和之后与每个位置进行对比,那么可以提前的对最后一个位置的前缀和做好之后再依次遍历过程中求解,这样的空间复杂度就变为了常数。

class Solution:
    def minimumLevels(self, possible: List[int]) -> int:
        ans = -1
        s = 2*sum(possible)-len(possible)
        cur = 0
        for i in range(len(possible)-1):
            cur += 2*possible[i]-1
            if s-cur<cur:
                ans= i+1
        return -1
posted @ 2024-07-19 13:25  TICSMC  阅读(7)  评论(0)    收藏  举报