游戏英雄升级潜力评估题目解析 | 豆包MarsCode AI 刷题

76 阅读4分钟

问题描述

小U在一款挂机游戏中拥有n个英雄。游戏中有一种历练升级机制,每天可以选择两个英雄进行历练,如果两位英雄的等级相同,则他们的等级都不会改变。如果英雄等级不同,那么等级较高的英雄会增加1级,而等级较低的英雄则保持不变。

小U希望至少有一个英雄能够达到 2000000000000000 级,他想知道有多少英雄有潜力通过历练达到这个等级。

测试样例

样例1:

输入: n = 5 ,u = [1, 2, 3, 1, 2]
输出:3

样例2:

输入:n=4,u=[100000,100000,100000, 100000]
输出:0

样例3:

输入:n=6,u=[1,1,1,2,2,2]
输出:3

题目解析

游戏机制

  • 每天选择两个英雄进行历练:

    • 如果两者等级相同:等级不变。

    • 如果两者等级不同:

      • 等级高的英雄增加1级。

      • 等级低的英雄不变。

目标

小U希望至少有一个英雄的等级能达到 2000000000000000 级,问题是:

  • 现有的英雄中,有多少个英雄有潜力通过不断历练达到这一目标?

思考

  1. 潜力英雄的定义:

    • 如果一个英雄的初始等级低于其他英雄,并且通过多次历练无法成为“等级最高”的英雄,那么它没有潜力达到目标等级。
    • 只有那些初始等级高于某些英雄的英雄,才能通过不断历练,逐渐拉开与低等级英雄的差距,从而有机会达到目标等级。
  2. 结论:

    • 任何英雄,如果它的等级不是最低,就有潜力通过历练达到目标等级。
    • 但如果它的初始等级是所有英雄中最低的,始终只能充当“低等级英雄”,无法得到提升。

核心简化

  • 找出所有英雄的最低等级。
  • 统计比最低等级高的英雄数量。

代码解析

主函数

public static int solution(int n, int[] u) {
    // 找到最低等级
    int minLevel = Arrays.stream(u).min().orElse(0);

    // 统计比最低等级大的英雄数
    int count = 0;
    for (int level : u) {
        if (level > minLevel) {
            count++;
        }
    }

    return count;
}

分步解析

  1. 找出最低等级英雄
int minLevel = Arrays.stream(u).min().orElse(0);
  • 使用 Arrays.stream(u).min() 找到数组 u 中最小值,即所有英雄的最低等级。
  • 如果数组为空,则返回默认值 0
  1. 统计有潜力的英雄
int count = 0;
for (int level : u) {
    if (level > minLevel) {
        count++;
    }
}
  • 遍历数组,统计所有等级高于最低等级的英雄。
  • 这些英雄都有可能通过历练拉开与低等级英雄的差距,最终达到目标。
  1. 返回结果
  • 最终 count 表示有潜力达到目标等级的英雄数量。

测试用例分析

样例一

n = 5;
u = [1, 2, 3, 1, 2];
  1. 最低等级:1
  2. 比1大的英雄:2,3,2,共3个
  3. 输出:3

样例二

n = 4;
u = [100000, 100000, 100000, 100000];
  1. 最低等级:100000
  2. 没有比最低等级还高的英雄
  3. 输出:0

样例三

n = 6;
u = [1, 1, 1, 2, 2, 2];
  1. 最低等级:1
  2. 比1大的英雄:2,2,2,共3个
  3. 输出:3

复杂度分析

  1. 时间复杂度:

    • 找到最小值: O(n)
    • 遍历数组统计: O(n)
    • 总复杂度: O(n)
  2. 空间复杂度:

    • 使用了常量空间,复杂度为 O(1)

扩展思路

如果需要进一步优化或扩展,可以考虑以下问题:

  • 如果目标等级是动态变化的,如何调整统计策略?
  • 如何设计一个算法模拟历练过程,而不仅仅是判断潜力英雄?

总结

这道题本质是模拟游戏中的机制,结合数学规律和代码实现,解决的核心在于识别哪些英雄具备升级潜力。代码清晰简洁,逻辑易于理解,性能优异,非常适合作为算法练习题目。