赢得比赛需要的最少训练时长【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(1)