948. Bag of Tokens
题解
这道题目的token是随便选的,所以从该细节推测出来,这道题不应该是个动态规划。
感觉像是个双指针或者贪心的思路。
我们先把所有token排序,然后尽可能的从左到右获取更多的分数。
当没有分数的时候,我们就用1分从最右端换取分数,再进行上述的步骤。
直到两个指针相遇,或者买不起最左端的token停止。
思考
问:这个循环的判断条件,为什么可以改成l < n && power >= tokens[l]?
答:因为当l > r的时候,if判断条件走不进去,无法进行power的补给,所以不满足power >= tokens[i]。
代码
class Solution {public:int bagOfTokensScore(vector<int>& tokens, int power) {sort(tokens.begin(), tokens.end());int n = tokens.size();int l = 0, r = tokens.size() - 1;int res = 0;while(l <= r && power >= tokens[l]) {power -= tokens[l ++];res ++;if (res && r > l && power < tokens[l]) {power += tokens[r --];res --;}}return res;}};
