3096.力扣每日一题 Java(前缀和)

  • 博客主页:音符犹如代码
  • 系列专栏:算法练习
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍

目录

解题思路

解题过程

时间复杂度

空间复杂度

Code


解题思路

本题的核心在于找到一个分割点,使得Alice在此分割点之前完成关卡所获得的分数严格大于Bob在此分割点之后(包括此分割点)完成关卡所获得的分数。由于Alice和Bob都采取最优策略,我们不需要模拟他们每一步的选择,而是可以通过计算前缀和来快速获取任意区间内关卡的分数总和。

解题过程

  1. 首先,我们创建一个前缀和数组prefixSum,其中prefixSum[i]表示possible数组中前i个元素的分数总和(简单模式关卡得1分,困难模式关卡扣1分)。

  2. 接着,我们遍历prefixSum数组(从第二个元素开始,因为第一个元素代表只有一个关卡时的分数,不满足题目要求),对于每个分割点i,我们计算Alice在此点之前的得分(即prefixSum[i])和Bob在此点之后(包括此点)的得分(理论上应该是prefixSum[n] - prefixSum[i],但考虑到Bob至少需要完成一个关卡,且我们希望Alice得分严格大于Bob,所以实际比较时可能不需要显式计算Bob的得分,而是比较Alice的得分与剩余关卡中可能获得的最大分数)。

  3. 如果在某个分割点,Alice的得分严格大于Bob在此之后可能获得的最大分数(这通常意味着Alice的得分加上至少一个关卡的最低分数仍然大于剩余关卡的分数总和),我们就找到了答案,即Alice需要完成的最少关卡数。

  4. 如果遍历完所有可能的分割点都没有找到满足条件的答案,则返回-1,表示Alice无法获得比Bob更高的分数。

然而,需要注意的是,上述过程中的第3步在实际编码时可能并不需要显式计算Bob的得分,因为我们可以直接通过比较Alice的得分和剩余关卡中简单模式与困难模式的数量差(或前缀和数组中的某个值)来做出判断。

时间复杂度

  • 我们需要遍历一次possible数组来计算前缀和数组prefixSum,这需要O(n)的时间。
  • 接着,我们需要遍历一次prefixSum数组来找到满足条件的分割点,这同样需要O(n)的时间。
  • 因此,总的时间复杂度是O(n)。

空间复杂度

  • 我们创建了一个前缀和数组prefixSum,其长度为n+1(为了包含整个possible数组的前缀和以及一个初始值为0的元素),因此空间复杂度是O(n)。

Code

class Solution {  
    public int minimumLevels(int[] possible) {  
        int n = possible.length;  
        int[] prefixSum = new int[n + 1]; // 前缀和数组,用于快速计算任意区间的分数和  
          
        // 计算前缀和  
        for (int i = 0; i < n; i++) {  
            prefixSum[i + 1] = prefixSum[i] + (possible[i] == 0 ? -1 : 1);  
        }  
          
        int aliceScore = 0; // Alice的分数  
        int bobScore = 0; // Bob的分数  
        int aliceLevels = 0; // Alice完成的关卡数  
          
        // 遍历所有可能的分割点,尝试找到Alice获得更高分数的最少关卡数  
        for (int i = 1; i < n; i++) {  
            aliceScore = prefixSum[i]; // Alice完成前i个关卡所得的分数  
            bobScore = prefixSum[n] - aliceScore; // Bob完成剩余关卡所得的分数  
              
            // 检查Alice是否获得更高的分数  
            if (aliceScore > bobScore) {  
                // 找到第一个满足条件的分割点,即为最少关卡数  
                return i;  
            }  
              
            // 如果Alice和Bob分数相同,则Alice需要继续完成更多关卡  
            aliceLevels++;  
        }  
          
        // 如果没有找到满足条件的分割点,则返回-1  
        return -1;  
    }  
}

美具有引人向善的作用和力量——柏拉图(Plato)

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值