Link: Bag of Tokens
Thought
For this question, I find we could do 2 things: spend any cost form the tokens, and get 1 point. Or, spend 1 point, get any power from the tokens. So it turns to be pretty clear that I will firstly sort all tokens by value, and trying to get as much point as possible by flipping from left(smaller) side. If I can not flip any more, try to gain as much power as possible(AKA from right side).
And during the same time, keep tracking the maximum points I can get.
Code
class Solution(object):
def bagOfTokensScore(self, tokens, P):
"""
:type tokens: List[int]
:type P: int
:rtype: int
"""
tokens.sort()
init = 0
maxx = 0
lindx = 0
rindx = len(tokens) - 1
while lindx <= rindx:
while lindx <= rindx and tokens[lindx] <= P:
P -= tokens[lindx]
init += 1
lindx += 1
maxx = max(maxx, init)
if init == 0:
break
if lindx <= rindx:
init -= 1
P += tokens[rindx]
rindx -= 1
return maxx
Runtime
Time: O(NlogN)
Space: O(1)