赢得比赛需要的最少训练时长【LC2383】
你正在参加一场比赛,给你两个 正 整数
initialEnergy和initialExperience分别表示你的初始精力和初始经验。另给你两个下标从 0 开始的整数数组
energy和experience,长度均为n。你将会 依次 对上
n个对手。第i个对手的精力和经验分别用energy[i]和experience[i]表示。当你对上对手时,需要在经验和精力上都 严格 超过对手才能击败他们,然后在可能的情况下继续对上下一个对手。击败第
i个对手会使你的经验 增加experience[i],但会将你的精力 减少energy[i]。在开始比赛前,你可以训练几个小时。每训练一个小时,你可以选择将增加经验增加 1 或者 将精力增加 1 。
返回击败全部
n个对手需要训练的 最少 小时数目。
-
思路:
按顺序模拟整个比赛过程,如果精力或者经验比对手小,那么在比赛开始需要将该值训练至大于对手的,由于需要返回最少小时数目,那么比对手大1即可,统计训练总时长,返回即可
-
实现
class Solution { public int minNumberOfHours(int initialEnergy, int initialExperience, int[] energy, int[] experience) { int n = energy.length; int res = 0; for (int i = 0; i < n; i++){ if (initialEnergy <= energy[i]){ res += energy[i] - initialEnergy + 1; initialEnergy = energy[i] + 1; } if (initialExperience <= experience[i]){ res += experience[i] - initialExperience + 1; initialExperience = experience[i] + 1; } initialEnergy -= energy[i]; initialExperience += experience[i]; } return res; } }- 复杂度
- 时间复杂度:O(n)O(n)O(n)
- 空间复杂度:O(1)O(1)O(1)
- 复杂度

该问题涉及模拟比赛过程,通过对每个对手的经验和精力对比,计算出在保证战胜所有对手情况下所需的最小训练时间。在每轮比赛中,如果当前属性不足,则需在比赛前进行相应训练,确保至少比对手多1。最后返回累计的训练小时数。时间复杂度为O(n),空间复杂度为O(1)。
2万+

被折叠的 条评论
为什么被折叠?



