你的初始 能量 为 power
,初始 分数 为 0
,只有一包令牌以整数数组 tokens
给出。其中 tokens[i]
是第 i
个令牌的值(下标从 0 开始)。
你的目标是通过有策略地使用这些令牌以 最大化 总 分数。在一次行动中,你可以用两种方式中的一种来使用一个 未被使用的 令牌(但不是对同一个令牌使用两种方式):
-
朝上:如果你当前 至少 有
tokens[i]
点 能量 ,可以使用令牌i
,失去tokens[i]
点 能量 ,并得到1
分 。 -
朝下:如果你当前至少有
1
分 ,可以使用令牌i
,获得tokens[i]
点 能量 ,并失去1
分 。
在使用 任意 数量的令牌后,返回我们可以得到的最大 分数 。
示例 1:
输入:tokens = [100], power = 50 输出:0 解释:因为你的初始分数为 0,无法使令牌朝下。你也不能使令牌朝上因为你的能量(50)比 tokens[0] 少(100)。
示例 2:
输入:tokens = [200,100], power = 150 输出:1 解释:使令牌 1 正面朝上,能量变为 50,分数变为 1 。 不必使用令牌 0,因为你无法使用它来提高分数。可得到的最大分数是 1。
示例 3:
输入:tokens = [100,200,300,400], power = 200 输出:2 解释:按下面顺序使用令牌可以得到 2 分: 1. 令牌 0 (100)正面朝上,能量变为 100 ,分数变为 1 2. 令牌 3 (400)正面朝下,能量变为 500 ,分数变为 0 3. 令牌 1 (200)正面朝上,能量变为 300 ,分数变为 1 4. 令牌 2 (300)正面朝上,能量变为 0 ,分数变为 2 可得的最大分数是 2。
解题方法:(排序+贪心+双指针)
1.这道题刚开始看无从下手,但是由于题目中涉及到数的和的问题,所以我们首先对数组进行排序,这样子我们就可以直到我们可以使用贪心加双指针来进行解题。
2.设定好左右双指针之后,开始遍历数组,当我们的power
大于当前的tokens[i]
时,我们最好的选择便是消耗能量来进行加分。
3.当我们的power
不够消耗时,我们直接使用朝下
来加能量直到够消耗为止。
class Solution {
public int bagOfTokensScore(int[] tokens, int power) {
Arrays.sort(tokens);
int ans = 0;
int n = tokens.length;
int i = 0, j = n - 1;
while (i <= j && power >= tokens[i]) {
while (i <= j && power >= tokens[i]) {
power -= tokens[i++];
ans++;
}
if (i < j) {
power += tokens[j--];
ans--;
}
}
return ans;
}
}
标签:分数,令牌,java,power,tokens,100,能量,leetcode
From: https://blog.csdn.net/W_L_MM/article/details/145219993