算法笔记11:令牌放置

146 阅读1分钟

948.令牌放置

一开始做的时候想复杂了,但其实是对规则没有太理解。如果最后是为了赚取最大的 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;
};