你的初始能量为 P
,初始分数为 0
,只有一包令牌。
令牌的值为 token[i]
,每个令牌最多只能使用一次,可能的两种使用方法如下:
- 如果你至少有
token[i]
点能量,可以将令牌置为正面朝上,失去token[i]
点能量,并得到1
分。 - 如果我们至少有
1
分,可以将令牌置为反面朝上,获得token[i]
点能量,并失去1
分。
在使用任意数量的令牌后,返回我们可以得到的最大分数。
示例 1:
输入:tokens = [100], P = 50 输出:0
示例 2:
输入:tokens = [100,200], P = 150 输出:1
示例 3:
输入:tokens = [100,200,300,400], P = 200 输出:2
提示:
tokens.length <= 1000
0 <= tokens[i] < 10000
0 <= P < 10000
===================================================
解题思路:贪心算法
先对数组进行排序,然后从小到大开始翻,能翻多少翻多少,没法翻了就"卖分",从后面获得最大的能量,然后接着翻,直到循环结束为止
下面是代码 :
class Solution {
public int bagOfTokensScore(int[] tokens, int P) {
Arrays.sort(tokens);
if(tokens.length==0||tokens[0]>P){
return 0;
}
if(tokens.length==1){
return 1;
}
int res = 0;
int l = 0;
int r = tokens.length-1;
while(l<r+1){
if (P>=tokens[l]){
P-=tokens[l];
l++;
res++;
}else if(r>l+1){
P+=tokens[r];
r--;
res--;
}else {
break;
}
}
return res;
}
}