一开始做的时候想复杂了,但其实是对规则没有太理解。如果最后是为了赚取最大的 score 的话,那么肯定是用面值小的 token 来赚 score ,再用面值大的 token 去换更多的 power ,用贪心算法即可。
首先对所有 token 进行排序,再用两个指针。左指针部分的面值小,我们就用来换 score ;右指针部分的面值大,我们就用来换 power 。直到最后走不下去,结束循环即可。既然最后贪的是 score ,那么每次循环中我们先尽可能多的换 score 。
var bagOfTokensScore = function(tokens, power) {
const sorted = tokens.sort((a, b) => a - b);
let l = 0;
let r = sorted.length - 1;
let score = 0;
let result = 0;
while(l <= r) {
if (sorted[l] <= power) {
score += 1;
power -= sorted[l];
l++;
} else if (score > 0) {
score -= 1;
power += sorted[r];
r--;
} else {
break;
}
result = Math.max(score, result);
}
return result;
};